find()、findOrFail()、first()、firstOrFail()、get()、list()、toArray()の違いは何ですか


109

これらの方法の違いは何ですか:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. toArray()

私はそれらを使用してきましたが、それぞれが異なる結果をもたらし、関数が配列を期待しているため、toArray()最後に追加する必要がある場合がありget()ます。他の方法でも配列が生成されませんか?



@Joseph Silberからのすべての情報は正しく、非常に役立ちます。リスト()に答えを追加したいLaravel 5.2からコレクション、クエリビルダー、およびEloquentクエリビルダーオブジェクトのlistメソッドの名前がpluckに変更されました。メソッドのシグネチャは同じままです。
Nirav Bhoi 2018年

回答:


227
  1. find($id)IDを受け取り、単一のモデルを返します。一致するモデルが存在しない場合は、を返しますnull

  2. findOrFail($id)IDを受け取り、単一のモデルを返します。一致するモデルが存在しない場合、エラー1がスローされます。

  3. first()データベースで見つかった最初のレコードを返します。一致するモデルが存在しない場合は、を返しますnull

  4. firstOrFail()データベースで見つかった最初のレコードを返します。一致するモデルが存在しない場合、エラー1がスローされます。

  5. get() クエリに一致するモデルのコレクションを返します。

  6. pluck($column)指定された列の値のみのコレクションを返します。Laravelの以前のバージョンでは、このメソッドはと呼ばれていましたlists

  7. toArray() モデル/コレクションを単純なPHP配列に変換します。


注: コレクションは強化された配列です。配列と同様に機能しますが、ドキュメントで確認できるように多くの追加機能があります。

残念ながら、PHPでは、配列を使用できるすべての場所でコレクションオブジェクトを使用することはできません。たとえば、foreachループでコレクションを使用することarray_mapは問題ありませんが、コレクションを渡すことは問題ありません。同様に、引数をとしてタイプヒントするとarray、PHPではコレクションを渡すことができません。PHP 7.1以降、配列とコレクションの両方を受け入れるために使用できるiterabletypehintがあります。

コレクションからプレーン配列を取得したい場合は、そのall()メソッドを呼び出します。


1findOrFailおよびfirstOrFailメソッドによってスローされるエラーはModelNotFoundExceptionです。この例外を自分でキャッチしない場合、Laravelは404応答します。これは、ほとんどの場合に必要なものです。


1
片付けありがとうございます。これ$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);が問題です。アクセスできるようにこのような投稿のリストを取得しようとしています$post->subreddit->moderators->user_idが、アクセスできますが、追加したときUndefined property: Illuminate\Database\Eloquent\Collection::$user_idはアクセスでき$post->subreddit->moderatorsませんuser_id。なぜですか。
Halnex 2015年

subredditmoderatorsプロパティを持つ単一のモデルです。moderatorsはコレクションであり、単一のモデルではありません。そこから直接アクセスすることはできません。あなたがしたい場合は、最初のものを確認することができます$post->subreddit->moderators[0]->user_id
ジョセフSILBER

「エラーをスローします」を「ModelNotFoundException例外をスローします」に置き換える必要があると思います:Dとにかく大きな貢献;)
bobbybouwmann 2018年

@JosephSilberパーフェクト!
bobbybouwmann 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.