在数据透视表中雄辩地保存数据

时间:2018-07-14 23:37:00

标签: php laravel eloquent lumen

我试图在数据透视表中实现简单的插入,但是我不明白为什么它不起作用的原理。

我有一个Languages表,其中包含用语言填充的ID,名称和代码。我有一个填充用户的用户表。中间的表是users_languages,其列为user_id和language_id。

我的请求有这样的内容

{
   "languages": [1, 2] -> language ids
}

我在Users模型中使用的语言方法如下:

public function language() : BelongsToMany
{
    return $this
        ->belongsToMany(Language::class, 'users_languages')
        ->withPivot('user_id', 'language_id');
}

我正在尝试添加以下语言:

public function setLanguages(array $languages) : self
{
    $this->language()->delete();
    $this->language()->createMany($languages);

    return $this;
}

我得到的结果实际上是它试图在Languages表中创建一个新条目,而不仅仅是在user_id和language_id之间建立连接。

我一直在浏览文档和一些文章,了解它是如何工作的,但是我发现没有一种解决方案有效。我在项目中使用Lumen 5.5。预先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用attach()

public function setLanguages(array $languages) : self
{
    $this->language()->attach($languages);

    return $this;
}

如果要删除现有的数据透视表项,请使用sync()

public function setLanguages(array $languages) : self
{
    $this->language()->sync($languages);

    return $this;
}