複雑に思えるかもしれませんが、説明します。
- 私は 3 つのモデルを持っています。それらを A、B、C と呼びましょう。
- それらはすべて、多対多の関係を介して他のユーザーと関連付けることができます。
モデル C が、私のモデルに関連するモデル B と関連しているかどうかを確認したいと思います。
IDではなくモデルCの「名前」欄で確認したい。
編集:
irc で掘り下げて質問した後、私の以前のアプローチは、この問題に対処するための正しい方法ではないことがわかりました:)
議論への多大なインプットに対して@Oddmanと@Kindariに称賛-提案されているように、2つの「多対多モデル」AとBが関連しているかどうかをテストするには、リストメソッド(Illuminate\Support\Collection)を使用できます
in_array($b->id, $a->related()->lists('b_id'))
次に、C が B に関連しているかどうかを「名前」で確認したい場合は、この列が関係でどのように使用されているかについて詳しく教えてください - ピボット テーブルに存在しますか? もしそうなら、多分あなたは以下を試すことができます-しかし、それはここで私の野生の推測にすぎません...
in_array($c->name, $b->related()->lists('c_name'))
上記とは別に、適切な結合を使用して生のSQLクエリをいつでも実行でき、それが確実に機能する方法です。@NDM が提案するところから始めることができます。
ドキュメントもチェックするのは確かに良いことです:
http://four.laravel.com/docs/eloquent#many-to-many
http://four.laravel.com/docs/eloquent#working-with-pivot -テーブル
いくつかの内部結合を使用するだけではどうですか? Eloquent の良いところは、 Laravel の DB クエリ ビルダーを Eloquent モデルの一部としていつでも使用できることです。Eloquent はクエリ ビルダーに基づいて構築されているため、より複雑なケースを処理できます。
$a = A::select('a.id, a.name, b.id, b.name, c.id, b.name')
->join('a_b_pivot', 'a.id', '=', 'b.a_id')
->join('b_c_pivot', 'b.id', '=', 'c.b_id')
->join('b', 'a_b_pivot.b_id', '=', 'b.id')
->join('c', 'b_c_pivot.c_id', '=', 'c.id')
->where('c.name', '=', $name);
おそらく最も効率的な方法ではありませんが、機能するはずであり、モデルをウォークスルーしてすべてをモデルとしてロードするよりも効率的である必要があります。
テーブル名を持つすべてのフィールドに言及していることを確認してください。そうしないと、機能しません。クエリから返すモデルに応じて、C:: または B:: からクエリを開始し、それに応じて微調整することもできます。
その他の便利な方法は、クエリの一部として熱心な読み込みを使用するか、結果を取得した後に ->load('b,c) を使用することです。
そして、これからクエリスコープを作成できることを忘れないでください。コード内のどこでも簡単に再利用できます:)