2015-01-29 3 views
0

Я использую модель Laravel красноречивых модели этих таблиц:Запрашивания вычисляемого атрибута в нетерпеливых загруженных отношениях

пользователи: idfirstNamelastNamepasswordemail

сообщение: iduser_idtitlecontent

с Сообщение модели, имеющее отношение 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); 

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

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); 
Смежные вопросы