【问题标题】:Laravel Eloquent - How to define such a relationship: Comment::language()->nameLaravel Eloquent - 如何定义这样的关系:Comment::language()->name
【发布时间】:2018-08-26 13:29:42
【问题描述】:

语言表有:id、简码

cmets表有id、user_id、comment、language_id(外键)

在评论模型中,我将语言定义为 hasOne 关系

在语言模型中,我将 Comments 定义为 hasMany 关系(这是错误的吗?)。

在 Tinker 中,当我尝试执行时出现此错误:$comment->language()->get():

Column not found: 1054 Unknown column 'languages.comment_id' in 'where clause' (SQL: select * from `languages` where `languages`.`comment_id` = 7 and `languages`.`comment_id` is not null)'

为什么 Laravel 在语言表中搜索 comment_id?看来我完全误解了一些东西。

获取语言简码的正确方法是什么?我认为 $comment->language()->shortcode 应该可以工作。

什么是预加载所有 language_id 和短代码信息而不执行重复查询的最有效方法,因为这经常使用?

【问题讨论】:

  • 评论模型应该有一个belongsTo关系,而不是hasOne。此外,表应命名为 cmets 和语言,而不是注释和语言。

标签: php laravel eloquent


【解决方案1】:

Laravel 对你的关系中的键名做出假设。因为你使用 hasOne 关系,Laravel 期望键在语言表中,命名为 comment_id。

您的 Comment 模型应该使用与 Language 的 belongsTo 关系并删除 hasOne。这样,laravel 就假设外键实际上在 cmets 表中,名为 language_id,就是这种情况:)。

【讨论】:

  • 谢谢。我有另一个问题: $comment->language()->get() 有效,但 $comment->language()->shortcode 无效。这样做的正确方法是什么?
  • 关系有两点需要考虑: 1. 如果你使用关系的函数版本:$comment->language();你总是收到关系本身。这样您就可以扩展您的查询。对 belongsTo 不是很有用,但对 hasMany 很有用。 2.如果使用关系的成员版本:$comment->language;您与对象本身交谈。或者在 hasMany 关系中,你得到一个 Illuminate\Support\Collection。考虑到这些选项,您总是可以做出最好的决定:)
  • 如果我的回答对您有帮助,我建议您点击那个回答按钮 ;)
  • 是的,这很有帮助。我太新了,无法投票给你(它还不会注册投票)。但我很欣赏你的回复。我已经十年没有编程了,事情发生了很大变化。
  • @HansM。由于您是此问题的作者,因此您实际上可以通过单击灰色复选标记将此答案标记为正确,从而为您的撒玛利亚人带来当之无愧的声誉。
【解决方案2】:

使用 belongsTo 关系解决了这个问题。

之后我可以使用 $comment->language->shortcode 访问它;

谢谢大家!

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 2018-01-21
    • 1970-01-01
    • 2017-01-19
    • 2017-04-02
    • 2023-04-01
    • 2020-12-14
    • 2020-06-28
    • 2021-10-31
    相关资源
    最近更新 更多