Я использую модели 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
не столбец в таблице, а только вычисляемый атрибут. так как я могу это сделать?
Вы не сможете использовать свой аксессор внутри запроса. У вас есть два варианта:
Вариант первый: продублируйте логику доступа внутри запроса:
$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);
Других решений пока нет …