コメントに記載されているように、これが推奨される理由はわかりませんが、使いやすさから、モデルの関係にアクセスできるということは、別のプロパティとしてjoin
、特にmany-to-one
の関係の場合には、
->with()
と->leftJoin()
の両方の方法を使用して上記の例を比較しましょう。
->with()
を使用する場合、すべての関係は、$company->users
によってアクセスされるCompany
のプロパティとして定義されます。 foreach($company->users AS $user)
ループを実行してusername
,email
などの出力情報を簡単に実行できます。Company
にはusers
が含まれていないと、空の値を表示することを心配する必要はありません(特にチェーンモデルでは重要です)。 users.user_details
などの表記)。
今、leftJoin()
を見てください。各モデルとそのサブモデルに複数のleftJoins()
を連鎖しようとすると、期待している結果が得られない可能性があります。本質的には、leftJoin()
は、個々のクエリと同様にNULL
レコードも処理しません。 Eloquent
がまったくうまく重複のプロパティを処理しないように、これは問題になる
foreach($company AS $row){
echo $row->username;
echo $row->email;
// etc etc
}
:
次に、同社のユーザーの出力にリストは、次のようなループを実行する必要があります。たとえば、会社にemail
フィールドとユーザーがある場合、実際に表示されるのは誰の推測でもあります。 selectRaw("companies.email AS email, users.email AS user_email)"
を実行しない限り、1つのemail
プロパティのみが返されます。これは、id
のような列にも適用されます。ここでは、複数の列はleftJoin()
を使用してフェッチされますが、実際にアクセス可能な列は1つだけです。
かいつまんで、重複した情報は、null情報など->with()
方法を使用して複数のクエリを実行しているのパフォーマンスはないかもしれないが可能性を持つ複数のテーブルを結合しようとしたときleftJoin()
は、問題の多くの潜在的な付属しています最高ですが、情報の検索と表示に使いやすくなります。
複数の ' - > with()'節は必要ありません。配列の構文を使用してください: ' - > with([" users "、" machines "])'および 'dot.notation'連鎖: ' - > with([" users "、" users.other "])'など –
@TimLewisありがとうございました。 –
問題はありません:)私はそれがパフォーマンスに何らかの影響を与えるとは思っていませんが、コードを読んだり保守したりするのがちょっといいです。また、良い質問です。私は実際にそのようなログをチェックすることは決してありませんでしたが、私はアイデアを持っています*なぜこのようにしていますが、これが最も最適化されているかどうかは考えられません。 –