从Laravel中的原始列表中排除或删除子列表


Exclude or remove sub list from original list in Laravel

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的列表,而不是我需要的整个对象。所以我需要一个更好的解决方案。