如何同步hasMany关系上的子表数据?

Posted

技术标签:

【中文标题】如何同步hasMany关系上的子表数据?【英文标题】:How to synchronise child table data on hasMany relationship? 【发布时间】:2020-12-08 16:20:10 【问题描述】:

我有 2 个表 productsvariants,具有 hasMany 关系,结构如下:

产品型号

public function variants()

   return $this->hasMany(Variant::class);

变体模型

public function product()

   return $this->belongsTo(Product::class);

产品表

|     id          name            image          manufacturer
|     1           T-Shirt         t-s.jpg        docomo      
|     2           Short Skirt     s-skirt.jpg    docomo  

变量表

|     id     product_id      name       price    sku       quantity
|     1         1             S          30      ts-s       100
|     2         1             M          32      ts-m       100
|     3         1             XL         35      ts-xl      100
|     4         2             S          23      sk-s       100
|     5         2             M          25      sk-m       100
|     6         2             XL         28      sk-xl      100

我可以将 Product 模型中 Variant 模型(子表)的数据保存为:

public function store(Request $request)
       
    $q = new Product;
    $q->name = $request->name;
    $q->save();
    // Below child table
    $q->variants()->createMany($request->variant);

我可以存储数据,但问题是,如何更新子表? [可以创建、更新或删除] 我尝试使用sync() 方法,但没有奏效。其为manyToMany 关系。

public function update(Request $request)
       
    $q = Product::findOrFail($request->id);
    $q->name = $request->name;
    $q->save();
    // Below child table update
    // $q->variants()->sync($request->variant); // not worked

sync()manyToMany 关系中工作。 hasMany 关系我需要相同的。 我该怎么做?

【问题讨论】:

【参考方案1】:

不幸的是,hasMany 关系没有 sync 方法。自己做很简单。您可以简单地删除行并重新插入它们。

public function update(Request $request, Product $product)
       
    $product->update(['name' => $request->name]);
    // Below child table update
    $product->variants()->delete();
    $product->variants()->sync($request->variant);

【讨论】:

不要这样做,因为将来您可能需要存储数据透视数据。 如果他需要在数据透视表中保存额外的数据,他可以简单地在同步方法中传递一个带有额外信息的数组。这不是问题,您不确定是否会添加一个功能。

以上是关于如何同步hasMany关系上的子表数据?的主要内容,如果未能解决你的问题,请参考以下文章

同一个表'tableName'不能是两个嵌套关系中的子表

主表和子表是一对多,查询主表数据以及子表的某一条数据

休眠仅保存具有复合主键中的父外键的子表条目

access数据库中,怎么实现两个表的同步?

如何从 Spring Boot 项目中的子子表中检索数据?

获取所有父表数据,但仅获取满足条件的子表数据