laravel 5.6:多对多关系同步

时间:2018-04-11 18:39:54

标签: php laravel laravel-5 many-to-many

我创建了3个表

articles : id title

category: id name

article_category:  id article_id category_id main

Category模型中:

public function articles()
{
    return $this->belongsToMany(Article::class);
}

我想将数据添加到article_category

$article_id = 20;
$category_id = 1;
$category = Category::find($category_id);
$cat[$article_id] = ['main'=>false];
$category ->articles()->sync($cat);

$article_id = 20;
$category_id = 2;
$category = Category::find($category_id);
$cat[$article_id] = ['main'=>false];
$category ->articles()->sync($cat);

现在在article_category我有:

article_id    category_id   main
20              1           false
20              2           false

好的看起来很正常。

例如,如果再次添加:

$article_id = 20;
$category_id = 2;
$category = Category::find($category_id);
$cat[$article_id] = ['main'=>false];
$category ->articles()->sync($cat);

它不会生成重复行。

现在我的问题是:

如果我添加一个新的article_id,它会删除所有上次保存的记录。

例如添加这些代码:

$article_id = 21;
$category_id = 1;
$category = Category::find($category_id);
$cat[$article_id] = ['main'=>false];
$category ->articles()->sync($cat);

$article_id = 21;
$category_id = 2;
$category = Category::find($category_id);
$cat[$article_id] = ['main'=>false];
$category ->articles()->sync($cat);

我希望如此:

article_id    category_id   main
20              1           false
20              2           false
21              1           false
21              2           false

但在我的数据库中,我有这个:

article_id category_id main 21 1假 21 2假

我错了什么?

1 个答案:

答案 0 :(得分:1)

根据Laravel 5.6中的文档, 将从中间表 中删除不在给定数组中的任何ID。它只会为category_id创建多对多的关系,其中$ cat变量包含其各自的id。

这就是为什么它会在添加新文章时删除所有上次保存的记录。

如果您想附加新关系,只需使用

即可
 $category->articles()->syncWithoutDetaching($cat);