【问题标题】:Saving data with eloquent in a pivot table在数据透视表中使用 eloquent 保存数据
【发布时间】:2018-07-14 23:37:00
【问题描述】:

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

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

我的请求是这样的

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

我的用户模型中的语言方法如下所示:

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。提前感谢您的帮助!

【问题讨论】:

    标签: php laravel eloquent lumen


    【解决方案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;
    }
    

    【讨论】:

    • 感谢您的帮助,我实际上之前尝试过这两种方法,但我得到的错误是这些方法不存在,现在突然起作用了。我现在唯一的问题是,现在看来 language_id 终于通过了,但不知何故我的 user_id 现在为空。你认为我必须以某种方式将它添加到语言方法中吗?
    • 你能用\DB::enableQueryLog(); [...] dd($log = \DB::getQueryLog());记录查询吗?
    • dd($languages); 的结果是什么?
    • 语言只包含语言ID,我必须手动添加user_id吗?这样做似乎有点不正确。
    • 可以发一下查询日志吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2019-04-07
    • 2016-04-11
    • 2016-02-21
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多