2015-02-11 83 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