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