laravelの環境用意しようとしたらエラー吐いた
pullしてcomposer updateしとけばええんやろ?って感じでやってたら
Fatal error: Class 'Illuminate\Foundation\Application' not found in /path/to/project/bootstrap/app.php on line 14
って怒られた…。 あれパスが通ってない?とか数瞬考えたけどそもそもcomposer installじゃんって事に気付いた。 他にも同じボケかました人いそうだなーって検索したらlaracastsとかstackoverflowにもスレッドあって安心したよね。
laravelで空白の代わりにnullを登録したい
追記: laravel5.4でConvertEmptyStringsToNullとか言う素敵ミドルウェアが出たので今後はそっちで。
larabelのEloquent使って以下のようにデータを登録しようとするとフォームにデータが入っていないカラムは空白で登録されてしまう。
<?php Hoge::create($request->all());
Hogeモデルの中で以下のようにミューテータを定義しておけばnullに変換して登録してくれる。
<?php public function setHogaAttribute($field) { $this->attributes['hoga'] = trim($field) !== '' ? $field : null; }
追記
Hogeモデル内の全カラムに対して適用する場合は以下のようにするとよさ気。
<?php public static function boot() { parent::boot(); static::saving(function ($model) { foreach ($model->attributes as $key => $value) { if ($value !== 0) { $model->{$key} = empty($value) ? null : $value; } } }); }
laravelでcsv出力とか大量データを取得する場合にどうすれば良いのか試行錯誤した。
たまにはブログでも始めてみよう。
結果を先に言うとpdoで実行してしまうのがよさそう。
以下自分の辿った流れ。
get()で取得する
- 簡単だけどgetした場合すべてメモリ上に展開されるので大量データの処理には向いていない。
<?php $results = List::get(); foreach($results as $row) { // 処理 }
chunk()で指定件数ずつ処理する
- 指定件数分取得してクロージャ内の処理を行ってくれて素敵。
- SQLで指定件数分取得 > 処理を繰り返すので大量のクエリを発行する可能性がある。
- SQLを複数回発行するのでソートしておかないと意図しない動作をする可能性がある。
<?php List::orderBy('id')->chunk(1000, function ($results) { foreach ($results as $row) { // 処理 } });
pdoのコネクション取ってフェッチしていく
- SQLが一回で済む。
- fetchしてる分しかメモリ上に展開しないはず。
<?php $query = List::query(); $statement = DB::Connection()->getPdo()->prepare($query->toSql()); $statement->execute($query->getBindings()); while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { // 処理 }