映画 オデッセイを見てきた

マット・デイモンが火星に置いてけぼり食らうお話。 絶望的状況で一人生き延びようとするんだけどとにかく全体的にポジティブで拍子抜けした。 まぁ思っていたのとは違ったってだけでめちゃくちゃ面白かったけどね。 宇宙でひとりぼっちってなるとインターステラー思い出すけど個人的にはこっちの方が好きかも。 ディスコミュージックを効果的に使ってたり音楽もかっこよかったしね。

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)) {
  // 処理
}