使用带有belongsTo关系的访问器mutator


Using accessor mutator with a belongsTo relationship

使用Laravel 4,我在我的用户模型中设置了一个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

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

错误是:"Trying to get property of non-object"

我是否在错误的地方调用了mutator ?我曾尝试将其放入关系选择字段中,但也搜索了fullname的字段名称和错误。

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

为了理解其中的原因,你需要首先理解当你要求Eloquent获取所有的Cars和它们的salesManager时,它是如何急切地加载salesManager关系的。在这种情况下,Eloquent会做以下事情:

  1. 装载所有汽车
  2. 获取所有已加载汽车的sales_manager列的值
  3. 加载id值在第2点范围内的所有用户
  4. 通过匹配获取的用户模型id和汽车的sales_manager列,将加载的用户模型映射到汽车上。
如您所见,第4步是不可能完成的。用户的id字段没有列在要为salesManager关系获取的字段列表中,因此当急切加载salesManager时,将无法将获取的用户与汽车匹配。您需要将您在salesManager关系中引用的字段添加到列表:
public function salesManager()
{
    return $this->belongsTo('User', 'sales_manager')->select('first_name', 'last_name', 'id');
}