エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel6.1】LazyCollectionにeagerメソッドが追加されます【719日目】

アプデ

laravel-news.com

6.0から追加された、LazyCollectionというクラスに、新しく eager()が追加されました。

どんなことが起こる?

github.com

@return static`

なので、LazyCollectionが返されます。

そして、eagerが呼び出された時点での中身を使用してLazyCollectionが渡されます。

テストコードみて理解してみる

    public function testEager()
    {
        $source = [1, 2, 3, 4, 5];

        $data = LazyCollection::make(function () use (&$source) {
            yield from $source;
        })->eager();

        $source[] = 6;

        $this->assertSame([1, 2, 3, 4, 5], $data->all());
    }

$dataは$sourceを参照して値を返す。

$source[] = 6;で参照先の値が変わっています。
ですが、$dataが定義された時点では、$sourceは[1,2,3,4,5]が参照されているので、$data->all()では[6]の値が含まれていません。

何が嬉しい?

LazyCollectionは、foreachなどが呼び出されたときに値の取得をします。

例えば、ログを取得して出力するLazyCollectionを作成したとき。

LazyCollectionを生成した時点ではログが1万行だったとして、その値がほしかったとき。

foreachで値を取得しようとしたときに、ログは変更され、1万100行だった場合には、1万100行取得してしまう。

それは困ると。LazyCollectionを生成した時点のデータがほしいんだ。
そんなときにeagerメソッドを使って生成すると良さそうですφ(・