2017-02-27 16 views
0

Laravel Eloquent Relationsができることは、INNER JOIN節を追加することはできないようです。私はそれを訂正していますか? whereHas句はWHERE EXISTSサブクエリを追加し、with句は個別のクエリで関係をロードするだけの "eager loading"プリフォームを追加します。Laravel Eloquent Relationships - MYSQLの "join"に相当する

もちろん、INNER JOINは、クエリの束を実行するよりも、より効率的な方法になるだろう、私はこれらのクエリのためjoin句を書かれている例がたくさんあります。

  1. は、私が同じジョイン・クエリに私が一緒に2つのテーブルを使用するたびに書き換える必要がないようにjoin句を定義するために説得力の関係を使用することが可能ですか?

  2. そうでない場合、なぜですか?関連している2つのテーブルを結合すると、標準化すべきものになるようです。 WHERE EXISTSのようなサブクエリを追加することは、どのようにして適切な代替手段になるのか実際には分かりません。 (私のテストによると、それははるかに遅いクエリを生成します....)

+0

を検討すべきであるhttps://laravel.com/docs/5.4/queries#joins – Jackowski

+0

@Jackowski - 迅速な対応に感謝します。私はあなたが手動でそれを必要とするすべてのクエリに 'join'節を追加できることを知っています。ここで私の質問は、Laravelの "モデル"で関係を定義し、毎回手動で入力するのではなく、自動的に 'join'節を含めることができるかどうかということです。 (それが不可能な場合は、関連するテーブルからデータを取得するための標準的な方法である必要があるため、Laravelでは標準ではない理由が不思議に思っていました。) –

答えて

2

@JackowskiはLaravelフレームワークは、複数のクエリを使用して対(例えばに参加する理由としては、joins can be performed using the query builder

を指摘のようにロード関係)は、次の理由により一般的にジョインが高価になるためです。

  1. ジョインは一般的にデカルト積を呼び出すため、遅いです。もちろん、これはインデックスにも、クエリオプティマイザがどのように動作するかによって異なります。
  2. ジョインはスケーラブルではありません。なぜですか?ジョインは、シャードされたデータベース/テーブルパーティションでは非常に非効率的です。複数のサーバーにスケーリングを開始してDBをシャードするとすぐに、コード内のすべての結合を削除する必要があります。偉大な例では、Pinterestのである - 彼らはスケールとして、they had to remove all joins for shardingもちろん

、まだクエリビルダを使用して行うが、Laravelは、開発者に質問を強制することができジョイン:あなたは本当に参加したり、別の方法がある必要がありますか?

免責事項:一般論は危険であり、あなたは常にあなたの特定のユースケース