Order和Item表之间存在多对多关系。订单模型中定义了这种关系
public function items()
{
return $this->belongsToMany('Item', 'order_item', 'order_id', 'item_id' );
}
如果客户在订单中添加一个项目,他会从列表中选择一个项目
$items = Item::all();
并且这个选择的项目是添加到中间(pivot)表(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。有什么建议吗??提前谢谢。
您可以使用whereDoesntHave
并使用以下关系过滤项目:
$items = Item::whereDoesntHave('orders', function($q) use ($id){
$q->where('order_id', $id);
})->get();
经过一段时间的搜索和尝试,我想出了一个简单但不专业的解决方案:
$order = Order::where('id', '=', $id)->with('items')->first();
$allitems= Item::all();
然后,一个php函数array_diff完成了任务:
$items = array_diff($allitems->lists('name','id'), $order->items->lists('name','id'));
但是$items只是id和name的列表,而不是我需要的整个对象。所以我需要一个更好的解决方案。