查询预加载关系中的计算属性
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);
我正在使用 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);