4

使用 Laravel 4,我在我的 User 模型中设置了一个 mutator:

public function getFullnameAttribute($value)
{
    return $this->first_name. ' ' .$this->last_name;
}

但是我在我的 Cars 模型中为链接到该车的用户 ID 设置了关系:

public function salesManager()
{
    return $this->belongsTo('User', 'sales_manager')->select('first_name', 'last_name');
}

我在我的 Car 表上调用这种关系:

$cars = Car::with('marqueBasic', 'modelBasic', 'salesManager')
    ->get();

现在,我该怎么做

$car->salesManager->fullname

目前不起作用,我假设这是因为它在另一个模型中被调用?

错误是:“试图获取非对象的属性”

我在错误的地方调用了mutator吗?我尝试将其放入关系选择字段中,但也搜索了全名的字段名称并出现错误。

4

1 回答 1

1

可能的原因是您正在定义要为关系获取的字段列表。

为了理解原因,您首先需要了解当您要求 Eloquent 使用 SalesManager 获取所有汽车时,它是如何急切地加载salesManager关系的。在这种情况下,Eloquent 会执行以下操作:

  1. 加载所有汽车
  2. 获取所有装载汽车的sales_manager列的值
  3. 加载所有具有第 2 点值内的 id 的用户。
  4. 通过匹配获取的用户模型的 id 和汽车的 sales_manager 列,将加载的用户模型映射到汽车。

如您所见,第 4 步是不可能的。用户的id字段未列在要为salesManager关系获取的字段列表中,因此 Eloquent 在急切加载salesManager时无法将获取的用户与汽车匹配。您需要将您在salesManager关系中引用的字段添加到列表中:

public function salesManager()
{
    return $this->belongsTo('User', 'sales_manager')->select('first_name', 'last_name', 'id');
}
于 2015-07-29T09:56:05.127 回答