Laravel 4.2 - 通过自己的id更新数据透视表

时间:2015-06-26 19:34:22

标签: laravel laravel-4 eloquent

我的数据透视表遇到了一些问题。我已经认识得太晚了,有些枢轴行在我的项目中没有唯一值,这意味着我要在我的数据透视表中添加一个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()方法?

0 个答案:

没有答案