【问题标题】:Laravel 5.3 to 5.4 relations foreignKey issueLaravel 5.3 到 5.4 关系外键问题
【发布时间】:2017-12-13 02:58:40
【问题描述】:

更新到 5.4 后,我的关系不再正常工作。检查后我发现 Laravel 现在正在寻找不同的 foreignKey 名称:user_user_idpost_post_id 而不是 user_idpost_id 等。这一直有效到 L 5.3。我还必须将一些数据透视表的主键更新为 tag_tag_id 等,以使它们再次工作。

我根据这个新约定更新了我的表外键名称,现在它正在工作。但我仍然想知道为什么以及如何改变以及它来自哪里。

谢谢!

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

    您是否使用 getKeyName 覆盖模型上的主键?

    Laravel 仍然使用相同的约定 user_id 作为外键。

    但是,在 5.4 中,您不需要在定义关系时显式指定外键。

    来自文档:

    就像之前的 Laravel 版本一样,这种关系通常使用 user_id 作为外键。但是,如果您覆盖 User 模型的 getKeyName 方法,则行为可能与以前的版本不同

    Upgrading To 5.4.0 From 5.3

    更新

    这个问题也可能是由设置 $primaryKey 的值引起的。 您没有提交任何代码。但是,假设在您的用户模型上,您定义 $primaryKey = user_id Laravel 会将列名称附加到此键名称。因此,您会看到 laravel 尝试查询 user_user_id。

    只需从用户模型中删除 $keyname,laravel 将假定遵循约定 user_id 的外键。

    或者您可以定义外键,将第二个参数显式传递给 belongsTo(): return $this->belongsTo(User::class, 'user_id);

    【讨论】:

    • 不,我只在用户模型本身中设置了 $primaryKey。并像这样在我的帖子模型中加载关系: public function user() { return $this->belongsTo(User::class); }
    • 设置 $primaryKey 与覆盖导致问题的 getKeyName 方法相同。
    • 好的,但是如果我不设置 $primaryKey,它会在我的用户表中查找列“id”,因为我的主键是“user_id”,所以它不会找到。 QLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列 'id'(SQL:select * from users where id = 26 限制 1)。这意味着我必须将所有主键更改为“id”。那么将primaryKey设置为自定义值就没用了
    • 查看更新。您可以从所有模型中删除 $primaryKey,在这种情况下,laravel 将假定它是“id”。或者你告诉它在定义关系时使用哪个外键。
    • 谢谢,返回 $this->belongsTo(User::class, 'user_id);作品。删除主键时,它不会查找 user_id,而只会查找 id。所以我只会在关系方法中定义外键:-)
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多