【问题标题】:Laravel Eloquent ORM: trouble with one-to-many using belongs_to()Laravel Eloquent ORM:使用 belongs_to() 的一对多问题
【发布时间】:2013-06-02 20:42:52
【问题描述】:

我无法在 Laravel 中访问关系。与这个问题相关,我有两个表,messagesusers

messages 表如下所示:

Messages: id, user_from, user_to, read, message, created_at, updated_at

users 表如下所示:

Users: id, email, password, name, created_at, updated_at, bio, reputation, last_login_ip, last_seen, active

user_fromuser_to 列都是整数,对应于发送消息的用户(主键)或发送消息的对象的 id

我的Message 模型的相关部分如下所示:

class Message extends Eloquent {

    //relationships
    public function user_from() {
        return $this->belongs_to('User', 'user_from');
    }

    public function user_to() {
        return $this->belongs_to('User', 'user_to');
    }
}

我的User 模型的相关部分如下所示:

class User extends Eloquent {

    //relationships
    public function messages_from() {
        return $this->has_many('Message', 'user_from');
    }

    public function messages_to() {
        return $this->has_many('Message', 'user_to');
    }
}

在一个视图中,我试图访问写消息的用户,编写如下代码:

{{ $message->user_from->name }}

这会在这一行上引发错误Trying to get property of non-object。我知道$message 对象已定义,因为除user_fromuser_to 之外的所有其他属性都已定义并完美打印出来。我已经多次阅读文档,但我无法弄清楚我在这里做错了什么......有人坚持吗?这似乎是一个教科书示例,但它不起作用。

我将数据传递给视图的方式是:

$messages = Message::where('user_to', '=', Auth::user()->id)->take(20)->get();

【问题讨论】:

  • 澄清一下,这是 Laravel 3。
  • 所以如果你回显 $message->user_to 你至少得到一个 id 吗?因为那你可以像这样解决它....echo (User::find($message->user_from)->name) ....虽然让关系正常工作会很好
  • 现在正在尝试。 编辑: 是的,回显$message->user_from 会给我它来自的用户的ID。我想只是没有建立与User 模型相对应的连接。视图中的 SQL 查询一点也不理想,但现在尝试解决方法...
  • 我可以在视图的开头做一些非常丑陋的事情,通过 $message->user_from = User::find($message->user_from);$message->user_to = User::find($message->user_to); 来正确定义它们......但必须有更好的方法吗?
  • 这似乎是每次运行查询的大量 SQL 开销(即对于每条消息),尤其是在有很多消息的情况下。

标签: php sql laravel eloquent table-relationships


【解决方案1】:

Message 模型中创建方法名称from_user()to_user() 而不是user_from()user_to()(并更改视图以对应)完全解决了这个问题。没有更改其他代码。

当您指定自定义字段(我认为)时,Laravel 会通过方法名称获取数据库字段。很奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 2013-07-21
    • 2013-06-19
    • 2014-05-24
    • 1970-01-01
    • 2016-02-11
    • 2016-03-16
    • 2015-05-18
    相关资源
    最近更新 更多