2015-02-11 82 views
1

我在Order和Item表之間具有多對多關係。 這種關係是爲了模型中定義:從Laravel的原始列表中排除或刪除子列表

public function items() 
{ 
    return $this->belongsToMany('Item', 'order_item', 'order_id', 'item_id'); 
} 

如果客戶將商品的順序,他從一個列表

$items = Item::all(); 

選擇一個項目,這個選擇的產品添加在中間(支點)表(order_id,item_id)。

問題是,我需要我的物品清單隻包含這些物品,而這些物品以前沒有被選擇過。即數據透視表不包含組合到這個特定順序的這些項目。

僞代碼:

$all_Items = Item::all(); 
$previously_Selected_Items = select_From_Pivot_Table::where('order_id', '=', $id); 
$required_Items_List = $all_items->exclude($previously_Selected_Items); 

我使用Laravel 4.2。 有什麼建議? 在此先感謝。

回答

0

後搜索和嘗試一些建議的想法有一段時間,我想出了方便,但不是專業的,解決方法:

$order = Order::where('id', '=', $id)->with('items')->first(); 
$allitems= Item::all();  

然後和array_diff,一個PHP函數,並獲得成功:

$items = array_diff($allitems->lists('name','id'), $order->items->lists('name','id')); 

但$ items只是一個id和name的列表,而不是我需要的整個對象。所以我需要更好的解決方案。

1

您可以使用whereDoesntHave和使用的關係,篩選項目:

$items = Item::whereDoesntHave('orders', function($q) use ($id){ 
    $q->where('order_id', $id); 
})->get(); 
+0

你可以將plz重定向到'whereDoesntHave'的解釋中,以便更好地理解它的工作。我搜索了網頁,但沒有發現任何內容。 @lukasgeiter – 2015-02-11 12:06:03

+0

查看[文檔]中的whereHas(http://laravel.com/docs/5.0/eloquent#querying-relations)。 「WhereDoesntHave'基本上是相反的。它將選擇所有沒有與條件相匹配的相關型號Order的產品('order_id = $ id') – lukasgeiter 2015-02-11 12:08:30

+0

'whereDoesntHave'似乎不存在。任何如何,我正在嘗試'whereHas',到目前爲止它返回一個空數組。有什麼建議麼? – 2015-02-11 13:03:34