Re:Laravelのlazyとchunk

昨日、ブログを書いて5分後に気づいたんですけど、書いたコードが間違ってて正しく比較できていませんでした。 あるあるだよなぁ。

というわけで、今日はその間違っていた箇所を見直していきます。 そもそも間違っていた箇所は、

Product::all()->lazy()->each(function ($product) {
    $this->assertNotNull($product->name);
});

ここで、allしてlazy()すると、Collectionのlazyが呼ばれるのでダメで、正しくは、Builderのlazyを呼び出さないとダメです。 なので、

Product::query()->lazy()->each(function ($product) {
    $this->assertNotNull($product->name);
});

が正しい。

それで、発行するクエリですが、chunkと一緒です。 LimitとOffsetで数を絞ってselectしていく感じです。 ただ、やっぱり気になるのはメモリへのデータの乗り方。 odenさんいわく、1行ずつ値を取る方法があるらしくて、それがPDOStatement::fetchらしいです。 ちょっと気になるのでがっつりデバッグすることにしました。

それで、lazy()の中身をデバッグしていたんですけど、どうやら$resultsにはCollectionが入っていて、もうこの時点ではメモリに載っているようです。 なので、resultsの中を読めば良い感じなのでまた明日...