2017-08-30 59 views
0

我訂購了訂單行,訂單行有一個產品。如何在遠程關係表Laravel上執行where查詢?

我想只檢索產品類型!= Partkit的orderLines。 所以我想查詢產品表,其中類型!= Partkit。

我該怎麼做? 訂單查詢:

$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,這不是我想要什麼,是不正確的......

這是一個遙遠的關係。

任何幫助表示讚賞

+0

您的訂單關係如何?這應該是一個遙遠的關係嗎? ...編輯:看起來這是一個遙遠的關係,你可能想在你的問題陳述中聲明。 – Devon

+0

@Devon是的,這是一個遙遠的關係。orderLines是訂單和產品關係orderLines – Rubberduck1337106092

回答

0

我想出了這個代碼做了什麼,我想......

查詢返回所有的,然後我手動忘記我不想orderLines。

不是最好的解決辦法,但能夠完成任務......

$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

問題在於,您可能會拉動WAY多於所需的行數。 – ollieread

0

可以使用has()方法。

$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

嘗試'whereHas()'而不是'has()' – ollieread

+0

仍然沒有運氣,不是相同的錯誤,但doens't返回我想要的輸出。 – 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存儲在'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