使用具有belongsTo关系的accessor mutator

时间:2015-07-29 09:39:07

标签: php laravel laravel-4 mutators

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

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

但我在我的汽车模型中设置了与该汽车相关联的用户ID的关系:

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

我在我的Car table上称这种关系为:

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

现在,我该怎么办呢。

$car->salesManager->fullname

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

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

我是否在错误的地方召唤变种人?我已经尝试将它放入关系选择字段,但也搜索了全名和错误输出的字段名称。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 加载所有车辆
  2. 获取所有已加载汽车的 sales_manager 列的值
  3. 从第2点开始加载所有id值的用户。
  4. 通过匹配获取的用户模型的ID和汽车的sales_manager列,将加载的用户模型映射到汽车。
  5. 如您所见,第4步是不可能的。用户 id 字段未列在 salesManager 关系的提取字段列表中,因此Eloquent在急切加载 salesManager 时,没有办法将获取的用户与汽车相匹配。您需要将 salesManager 关系中引用的字段添加到列表中:

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