昨日、ブログを書いて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の中を読めば良い感じなのでまた明日...