Laravel 1-N关系无法正常工作

时间:2014-04-06 05:59:06

标签: php laravel laravel-4 eloquent

我正在开始我的第一个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,但没有得到用户对象。我想改为使用用户对象。

非常感谢。

1 个答案:

答案 0 :(得分:0)

问题:

一切都很好,但您已使用user作为本地密钥,这就是混淆的原因,因为当您致电$feeling->user时,会调用魔术方法__get(),这是可在Illuminate/Database/Eloquent及其中找到;如下所示:

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

getAttribute()方法查找密钥的几个位置,然后依次查看Model本身然后查看关系数组,然后最后检查您的密钥是否为examaple user中的Model作为Feeling中的方法存在,在您的情况下为Feeling,然后它获取相关模型并找到键值。

因此,您的user字段为Model,因此在转到相关模型之前,它只会在当前user的属性中找到该字段,因此它认为,id字段已被请求,如果相关的模型实例,则会获得数字user

解决方案:

解决方案非常简单,将相关字段名称(user_id)更改为其他内容,更好的是user_id但您可以自由使用任何内容,但请确保不会再创建任何内容混乱。因此,如果您将其更改为public function user() { return $this->belongsTo('User','user_id'); } ,则对两个模型进行更改,例如:

user_id

但是,如果你使用// Feeling return $this->belongsTo('User'); // User return $this->hasMany('Feeling'); ,那么你可以省略两个模型的关系方法中的第二个参数,所以你可以写:

{{1}}