Laravel不会加载外键

时间:2015-08-01 10:14:28

标签: php laravel foreign-keys eloquent

我有一个名为对话的模型"来自"和"到"是用户表的外键。 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();

但我觉得有一个更好的。

2 个答案:

答案 0 :(得分:2)

这是因为您的列名和方法名称似乎相同。 当您执行$model->property语法时,Laravel会首先尝试为您指定您指定的属性的值。这与您的情况完全相同,因为您的模型中具有to属性。然后才开始关注人际关系。

是的,有2个解决方法适合您:

  1. 将方法名称更改为initiatorresponder

  2. 正如您所提到的,您可以$conversation->to()->get()

  3. 这也是为什么你应该总是命名你的数据库字段,如to_idfrom_id,这是建议的方法,这就是Laravel默认处理表的方式。因为这可以让你写下你的关系

    public function from() {
        return $this->belongsTo('App\User');
    }
    

    省略第二个参数。

答案 1 :(得分:0)

好的,解决方案非常简单。 我刚刚在两列的末尾添加了一个_id,它运行正常。在我看来,该列不允许与您要在其中加载的模型具有相同的名称。您不会覆盖您的值(在我的位置“从”和“到”)您只需添加另一个属性。