首页 > 解决方案 > Laravel 多对多插入每一侧

问题描述

我的问题可能很简单,但我没有找到正确的答案,我不知道我所做的是否是正确的方法。

我有一个文章和一个标签表,id 上有一个数据透视表。

我尝试做的是:

我的代码是:

$tags = [];
        foreach ($request->input('tags') as $key => $value) ;
            $tag = Tag::firstOrCreate(['nom' => $value]);
            $article->tags()->sync($tag);
        }

但它只同步最后一个标签。也许有比在 foreach 循环上同步更好的方法?

感谢您的帮助。

标签: phplaravel

解决方案


雄辩的同步方法指出:

sync 方法接受要放置在中间表上的 ID 数组。任何不在给定数组中的 ID 都将从中间表中删除。因此,此操作完成后,中间表中将仅存在给定数组中的 ID。

由于您在foreach循环中执行此操作,因此它将在循环的每次迭代中删除除相应标记之外的所有值。您想改为提供一组标签并在最后同步。

    foreach ($request->input('tags') as $key => $value) ;
        $tags[] = Tag::firstOrCreate(['nom' => $value])->id;
    }
    $article->tags()->sync($tags);

推荐阅读