2017-08-30 9 views
0

私はorderLinesで注文し、orderLineには製品があります。遠方の関係テーブルでwhereクエリを実行する方法Laravel?

商品タイプ!= PartkitのorderLinesのみを取得したいと考えています。 だからタイプ!= PartkitのProductテーブルを照会します。

どうすればよいですか? 受注クエ​​リ:

$order = Order::with('orderLines.product')->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

私が試したもの:

$order = Order::with('orderLines.product')->whereHas('orderLines.product', function($query) { 
      $query->where('type','!=', 'Partkit'); 
     })->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

これはオールウェイズ私が欲しいものではなく、正しくないNULLを返す...

は、これは遠い関係です。

任意のヘルプはあなたがhas()メソッドを使用することができます

+0

あなたの関係はオーダーのようですか?これは遠い関係になっていますか? ...編集:これは遠い関係のように見える、あなたは問題のステートメントでそれを述べることがあります。 – Devon

+0

@Devonはいこれは遠い関係です。orderLinesはorderの関係でproductはorderLinesの関係です – Rubberduck1337106092

答えて

0

私はその後、私は手動で私はしたくない注文ラインを忘れて、クエリがすべて返されます...このコードは、私が望んでいた

を考え出しました。

ない最善の解決策が、仕事を取得します...私の作品は何

$order = Order::with('orderLines.product')->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

foreach($order->orderLines as $key => $orderline) { 
    if(isset($orderline->product)){ 
     if($orderline->product->type == "Partkit") { 
      $order->orderLines->forget($key); 
     } 
    } 
} 
+0

解決方法を簡略化するためにコレクションメソッドを使用することもできます。 – Desh901

+2

ここで問題となるのは、必要以上に多くの行を取得する可能性があるということです。 – ollieread

0

を高く評価しています。

$order = Order::with('orderLines.product') 
      ->has('orderLines', function ($query) { 
       $query->has('product', function ($query) { 
        $query->where('type', '!=', 'Partkit'); 
       }); 
      }) 
      ->where('user_id',Auth()->user()->id) 
      ->where('is_order','0') 
      ->first(); 

これは、オーダーラインがタイプPartkitせずに製品を持っていることを提供し、すべての注文、彼らのためのライン、および対応する製品を選択します。

残念ながら、あなたは関係の関係について何もできないので、上記のようにそれらを入れなければなりません。

希望に役立ちます。

+0

これは動作しません 'strtolower()はパラメータ1が文字列、オブジェクトが与えられることを期待します' – Rubberduck1337106092

+0

'has()'の代わりに 'whereHas()'を試してください – ollieread

+0

まだ幸運ではなく、同じエラーではなく、私が望む出力を返すことはありません。 – Rubberduck1337106092

0

あなたはこれを試してみてください:

$order = Order::with(['orderLines.product' => function($query) { 
      $query->where('type','!=', 'Partkit'); 
     }]) 
     ->where('user_id',Auth()->user()->id) 
     ->where('is_order','0') 
     ->first(); 

更新答えをチェックして、私はその作業を知っているかどうか聞かせてください。

$order = Order::whereHas('orderLines.product', function($query) { 
      $query->where('type','!=', 'Partkit'); 
     })->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

はあなたのためにこの作品を願っています!

+0

は、partkitがOrderLineではなく 'product'に格納されているため、すべてのorderLinesを返します。 – Rubberduck1337106092

+0

@JordyGroote私はそれをチェックしましょう –

+0

@JordyGroote私の更新された答えがあなたのためにその助けになるかもしれないことを確認してください –

0

は、次のクエリである:、そうでない場合は変更

Order::with(['orderLines' => function($q) { 

    $q->with('product')->whereHas('product', function($q2) { 
     $q2->where('products.type', '!=', 'Partkit'); 
    }); 

}])->where('user_id', \Auth()->user()->id) 
->where('is_order', '0')->get(); 

貴社の製品テーブルがproductsと呼ばれていると仮定すると、 $q2->where(...)ステートメントのテーブル名

助けてくれたら教えてください。

+0

これにより、すべての行が返されますが、一致する商品がある注文ラインのみが含まれます。 – ollieread

+0

そうですが、それはモデルクラスでジョインと不要な '$ with'プロパティを使用しなければ私の心に来る唯一のことです。 – Desh901

関連する問題