2016-03-27 12 views
1

化学物質データベースで作業していて、私が行っているようにEloquentを学んでいます。これはLaraval自体ではなくSlim Frameworkにあります。 このスレッドは、私が必要なものに近づけるのを助けましたが、奇妙なものが見えています。解決策を見つけることができませんでしたが、多くの人が同様の質問をしました。Eloquent eager loadedクエリが結合でうまく動作しない

私は2をコメントアウトジョイン

$chemicals = $app->Chemical->with(array('Company', 'Room', 'Location', 'Measurement')) 
->join('company', 'company_id', '=', 'company.id') 
//->join('room', 'room_id', '=', 'room.id') 
//->join('location', 'location_id', '=', "location.id") 
->where('company', '=', 'ROUSSEL') 
->get(); 

お知らせがあります。それらの2つのフィールドは私のテーブルに正しく表示されますが、会社は空白です。どの結合が表示されるかを切り替えると、それに合わせます。

私がジョインを使用しない場合は、化学フィールドの1つでどこでも問題ありません。私の質問は、なぜ結合があるとその特定のステートメントを壊すように見えると、それを修正する方法はありますか?私は、それが何かのものであることを感じて、シーンの後ろにある種のことをしているが、特定のものを見つけることができませんでした.. ありがとう、

私は試してみましたEager Loading以前の制約。

$chemicals = $app->Chemical->with(
array(
    'Company', 
    'Room', 
    'Measurement', 
    'Location' => function ($query) { 
     $query->where('location', '=', 'FLAMCAB'); 
    } 
)) 
//->where('company', '=', 'FISHER') 
->get(); 

ここでコメントアウトされていない部分は、化学品の表にcompanyという列がないというメッセージが表示されます。 は、それを使用して、私は結果を取得しないでください:あなたは、それは場所のテーブルをフィルタリングし見ることができるように

Table when using the eager loading constraint

を、それはそれは私が「とは何である、ということで化学物質をフィルタリングしていないだけで、あることありません私はやっています。あなたがそれらに関連する場所に基づいて化学物質をフィルタリングする場合

+0

あなたは 'join'を使う必要がありますか? [Relationships](https://laravel.com/docs/5.1/eloquent-relationships)をまだ見ていますか? – alexw

+0

こんにちは@alexw、私はこの特定のクエリのためにする必要があると思った。私はこれらの4つのオブジェクトのそれぞれに化学物質が属しているという点で関係を使用しています。そこに私がやろうとしていることをするために使うことができる何かがありますか? – danny2327

+0

私が言っていることは(あなたの最後の質問からあなたのスキーマを覚えていれば)、それらの 'join'節は不要と思われます。彼らはあなたの化学物質のそれぞれの関連する会社、部屋、場所を掴んでいるようです。しかし、 'belongsTo'関係が既に定義されている場合、' with'節は各化学物質の関連会社、部屋、場所を取得するのに十分でなければなりません。 – alexw

答えて

0

、あなたはquerying relationship existenceconstraining eager loadsを組み合わせることができます

$filter = function ($query) { 
    $query->where('location', '=', 'FLAMCAB'); 
}; 

$chemicals = $app->Chemical->with(
    array(
     'Company', 
     'Room', 
     'Measurement', 
     'Location' => $filter 
    ) 
    ->whereHas('location', $filter) 
    ->get(); 

私はどのように効率的にこれはしかしあるか分からない - あなたは結果のクエリをチェックアウトする場合があります。もう1つの方法は、クエリを実行した後にCollection filtersを使用してコレクションを単にフィルタリングする方法です。

この質問はComplex query with filters with Eloquentでもお手伝いします。

+0

私の投稿を更新しました。 – danny2327

+0

この回答はうまくいきます。とてもかっこいい。私はquerylogを見て、それはあまりにも悪く見えません。もちろん、私は半ダースのエントリーしか持っていませんが、2000年が終わりに近づいてしまいます。私がその点に達すると、さらにテストを行い、遅い場合は、後でフィルタリングすることを覚えておきます。あなたの経験では、どちらが速くなると思いますか? あなたの努力のために大変ありがとうございます – danny2327

+0

これは難しい呼び出しです。 Eloquentが 'whereHas'のために余分なクエリを生成しなければならない場合、結果をマージするためにあなたのコレクションをとにかく歩かなければなりません。別のクエリを使わずにコレクションを歩くことができれば、それはおそらくもっと速くなるでしょう。しかし、確かめる唯一の方法は、時間を測定することです(例えば、['microtime()'](http://php.net/manual/en/function.microtime.php)) – alexw

関連する問題