我的数据透视表遇到了一些问题。我已经认识得太晚了,有些枢轴行在我的项目中没有唯一值,这意味着我要在我的数据透视表中添加一个auto_increment ID字段。
这是我的结构:
Order.php
public function items()
{
return $this->belongsToMany('Item', 'orders_items', 'order_id', 'item_id')->withPivot(['single_price', 'hours', 'prov', 'nanny_id', 'vat', 'vat_perc', 'invoice_id','id']);
}
orders_items
id, order_id, item_id, nanny_id, hours
我通过数据透视表('orders_items)'确认了订单和商品。有可能,一个订单在数据透视表中有两个或更多相同的项目。所以我要添加一个唯一的ID来识别和更新它们。
现在我尝试更新数据透视表行。问题是,如果我有2个或更多项目,他会更新所有项目,而不仅仅是一项。这是我的更新命令:
$order = Order::find($orderId);
$items = $order->items()->whereNull('nanny_id');
$free_item = $items->first();
$free_item->pivot->nanny_id = 123;
$free_item->pivot->save();
使用此命令,他会更新订单中的所有枢轴行。我知道这个问题:Laravel在这里使用了错误的标识符(它使用了我在belongsToMany关系中定义的order_id和item_id - 它们并不是唯一的)。例如,Laravel尝试在save()上执行此代码:
UPDATE orders_items SET [...] WHERE order_id = 123 AND item_id = 2;
我想,Laravel将查询更改为:
UPDATE orders_items SET [...] WHERE order_id = 123 AND item_id = 2 AND id = 45;
//编辑
好的,这个解决方案有效:
$free_item->pivot->where('id',$free_item->pivot->id)->update('nanny_id',123);
但有更简单的方法吗?添加自定义数据透视表模型,自动将id添加到save()和update()方法?