我有一个名为对话的模型"来自"和"到"是用户表的外键。 ModelClass:
class Conversation extends Model
{
protected $fillable = [
'from',
'to'
];
public function from() {
return $this->belongsTo('App\User', 'from');
}
public function to() {
return $this->belongsTo('App\User', 'to');
}
}
如果我打印
的结果$conversation = Conversation::with('to', 'from')->first();
我明白了。
{
"id": 1,
"from": {
"id": 15,
"name": "Maike",
"created_at": "2015-07-31 21:33:05",
"updated_at": "2015-08-01 09:19:51",
"remember_token": null
},
"to": {
"id": 1,
"name": "Max",
"created_at": "2015-07-31 21:32:53",
"updated_at": "2015-07-31 21:32:53",
"remember_token": null
},
"created_at": "2015-07-31 21:35:17",
"updated_at": "2015-07-31 21:35:17"
}
但是当我跑的时候
$ conversation->至
我只得到给定字段的id,而不是加载的用户。
一种可能的解决方案是使用
编写getToUserAttribute函数return $this->to()->get();
但我觉得有一个更好的。
答案 0 :(得分:2)
这是因为您的列名和方法名称似乎相同。
当您执行$model->property
语法时,Laravel会首先尝试为您指定您指定的属性的值。这与您的情况完全相同,因为您的模型中具有to
属性。然后才开始关注人际关系。
是的,有2个解决方法适合您:
将方法名称更改为initiator
和responder
正如您所提到的,您可以$conversation->to()->get()
这也是为什么你应该总是命名你的数据库字段,如to_id
和from_id
,这是建议的方法,这就是Laravel默认处理表的方式。因为这可以让你写下你的关系
public function from() {
return $this->belongsTo('App\User');
}
省略第二个参数。
答案 1 :(得分:0)
好的,解决方案非常简单。 我刚刚在两列的末尾添加了一个_id,它运行正常。在我看来,该列不允许与您要在其中加载的模型具有相同的名称。您不会覆盖您的值(在我的位置“从”和“到”)您只需添加另一个属性。