查询预加载关系中的计算属性

Querying a calculated attribute in eager loaded relationship

我正在使用 Laravel Eloquent 模型对这些 table 进行建模:

用户: id firstName lastName password email

posts: id user_id title content

Post 模型具有 hasOne ('User') 和 User 的关系具有计算属性的模型:

protected $appends = ['name'];

public function getNameAttribute(){
    return $this->attributes['name'] = $this->firstName.' '. $this->lastName;
}

我需要使用预先加载来仅获取 post 的作者姓名,而不是 users 中的所有列 table.

我试过:

$result = Post::with(
    [
        'user' => function( $query ){
            $query->select('name');
        }
    ]
)->get();

但显然 name 不是 table 中的列,而只是一个计算属性。那么我该如何完成呢?

您将无法在查询中使用访问器。您有两个选择:

选项一:在查询中复制访问器逻辑:

$result = Post::with(
    [
        'user' => function( $query ){
            $query->selectRaw("id, CONCAT_WS(' ', firstName, lastName) as name");
        }
    ]
)->get();

print_r($result->first()->user->name);

由于您的名称属性现在来自查询,因此这将需要您还修改访问器以使用现有值(如果它已经存在):

public function getNameAttribute($value = null) {
    $name = $value ?: $this->firstName.' '.$this->lastName;
    return $this->attributes['name'] = $name;
}

选项二:只需确保 select 您的访问者需要的所有字段:

$result = Post::with(
    [
        'user' => function( $query ){
            $query->select('id, firstName, lastName');
        }
    ]
)->get();

print_r($result->first()->user->name);