我的表结构是这样的:
invoices:
id, title, desciption, total_amount, --
products:
id, name, price, --
invoice_products
id, invoice_id, product_id, --
一张发票可以包含多种产品,因此
我创建了带有产品的发票,然后根据上述数据库结构填充数据。
当我更新发票(比如说invoice_id = 2)时,我感到困惑的是更新“ invoice_products”表的最佳方法是什么。
我的方法是(对于“ invoice_products”表):
我认为这不是一个好方法,因为我被迫删除“ invoice_products”中的行,然后再次插入新的更新产品。
有什么办法可以通过雄辩吗?
答案 0 :(得分:0)
我认为invoice_products是数据透视表。您应该使用同步方法。
$productIds = [1,2,3];
$Invoice->products()->sync($productIds);
在您的发票模型中,关系也应像这样
public function products()
{
return $this->belongsToMany(Invoice::class, 'invoice_products', 'invoice_id', 'product_id');
}
答案 1 :(得分:0)
您可以使用Laravel多对多关系来实现此功能:
发票模型
public function products()
{
return $this->belongsToMany('App\Product', 'invoice_products');
}
产品型号
尽管这里不是必需的,但是您可以使用它来获取相关产品的发票。
public function invoices()
{
return $this->belongsToMany('App\Product', 'invoice_products');
}
要更新现有数据,可以使用sync
方法:
$products = [1, 2, 3, 4];
$invoice->products()->sync($products);
您可以阅读有关https://laravel.com/docs/5.7/eloquent-relationships上的关系的更多信息