Laravel 5.7雄辩地更新/删除多个记录

时间:2019-02-21 14:55:55

标签: php laravel-5

我的表结构是这样的:

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_id = 2的invoice_products中删除*;
    • 然后再次插入修改过的产品。
  • 我认为这不是一个好方法,因为我被迫删除“ invoice_products”中的行,然后再次插入新的更新产品。

  • 有什么办法可以通过雄辩吗?

2 个答案:

答案 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');
}

More Details

答案 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上的关系的更多信息