Запрос вычисленного атрибута в нетерпеливо загруженных отношениях

Я использую модели Laravel Eloquent для моделирования этих таблиц:

пользователи: id firstName lastName password email

сообщений: id user_id title content

с Сообщение модель, имеющая отношение hasOne ('User') а также пользователь Модель, имеющая вычисляемый атрибут:

protected $appends = ['name'];

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

Мне нужно использовать готовую загрузку, чтобы получить только имя автора сообщение, и не все столбцы в пользователи Таблица.

Я старался:

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

но видимо name не столбец в таблице, а только вычисляемый атрибут. так как я могу это сделать?

0

Решение

Вы не сможете использовать свой аксессор внутри запроса. У вас есть два варианта:

Вариант первый: продублируйте логику доступа внутри запроса:

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

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

Поскольку ваш атрибут name теперь исходит из запроса, для этого потребуется также изменить свой метод доступа, чтобы использовать существующее значение, если оно уже существует:

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

Вариант второй: просто убедитесь, что выбраны все поля, необходимые вашему аксессору:

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]