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

Exclude or remove sub list from original list in Laravel

我在订单和项目之间有一个多对多的关系 table。 这种关系在订单模型中定义:

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

如果客户要向订单添加商品,他会从列表中选择一个商品

$items = Item::all();

并且这个选择的项目被添加到中间(枢轴)table(order_id,item_id)。

问题是,我需要我的商品列表只包含之前未为此订单选择的这些商品。即 pivot table 不包含组合到此特定顺序的这些项目。

伪代码:

$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();      

然后 array_diff,一个 php 函数,成功了:

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

但是 $items 只是一个 ID 和名称的列表,而不是我需要的整个对象。所以我需要一个更好的解决方案。