繁体   English   中英

Laravel 1-N关系不起作用

[英]Laravel 1-N relationship not working

我正在开始我的第一个Laravel项目。 我建立并测试了表之间的所有关系,它们看起来都很好,但是只有一个1-N关系。 我找不到错误,您能帮我吗?

表格:

User: *id *username

感觉:

*id *name *user (it points to User:id)

班级用户

<?php

class User extends Eloquent {

    protected $table = 'User';

    public function feelings() {
        return $this->hasMany('Feeling', 'user');
    }
}

课堂感觉

class Feeling extends Eloquent {

    protected $table = 'Feeling';

    public function user() {
        return $this->belongsTo('User','user');
    }
}

如果我执行:

$feeling = Feeling::find(1);
echo($feeling->user->username);

我收到一个错误“试图获取非对象的属性”。

如果我执行

$feeling = Feeling::find(1);

它打印感觉对象的Json数组,如果执行

$feeling = Feeling::find(1);
echo($feeling->user);

打印“ 1”。 因此,我正在获取数据库的用户ID,而不是用户对象。 我想改为获取用户对象。

非常感谢你。

问题:

一切都很好,但是您已经将user用作本地密钥,这就是造成混乱的原因,因为当您调用$feeling->user时,会调用魔术方法__get() ,该方法在Illuminate/Database/Eloquent __get()中可用,并且它可用; 如下所示:

public function __get($key)
{
    return $this->getAttribute($key);
}

getAttribute()方法在几个地方寻找关键字,然后依次检查Model本身,然后查看关系数组,然后最后检查案例user中的示例关键字是否作为Model的方法存在,是Feeling在你的情况,那么它得到的相关模型,并发现该键值。

因此,您的Feeling有一个作为user的字段,因此在进入相关模型之前,它只是在当前Model的属性中找到该字段,因此它认为已请求了user字段,而您获得了数字id而不是相关模型实例。

解:

解决方案非常简单,将相关字段名称( user )更改为其他名称,最好是user_id但是您可以随意使用任何名称,但要确保不会造成任何进一步的混乱。 因此,如果将其更改为user_id则对两个模型都进行更改,例如:

public function user() {
    return $this->belongsTo('User','user_id');
}

但是,如果您使用user_id则可以从两个模型的Relationship方法中省略第二个参数,因此您可以编写:

// Feeling
return $this->belongsTo('User');

// User
return $this->hasMany('Feeling');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM