[Laravel] Eloquentのget(), all(), toArray()の違い

スポンサーリンク

Eloquentのクエリビルダは最後に->get()とかを明示的に付ける必要があってRailsから移行した僕は時折忘れて悩んだりしています。
今回はModel::where()->get()で取得したコレクションのクラスとその配列への変換メソッド2種の違いについて記載します。

->get()

Post::where(‘author_id’, ‘1’)->get() などで返ってくるオブジェクトのタイプは
Illuminate\Database\Eloquent\Collection
となっています。
Laravel 5.7 Eloquent:コレクション
Collectionは様々な厳密にはarrayではありませんが[]添字をサポートしていたり、foreachに入れても動くようです。

->get()->all()

ただ厳密にarrayがほしい場合、取得したCollectionに->all()メソッドを呼び出すと、モデルインスタンス(上の例で言うとPost)の配列が返されます。

->get()->toArray()

Collectionを配列にしようとしたときまず目に入るtoArrayというメソッドですが、これを呼ぶと、Collectionが配列になった上で、更にモデルインスタンスが全てカラム名 => 値の並んだ連想配列に変換されます。
この状態だともはや各要素はモデルオブジェクトではなくただの連想配列なので、$post->commentsのようなことはできません。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする