@mrdragon9000

Как сделать select на двухуровневом with?

User, Ticket, TicketMessage
User hasMany Ticket, Ticket hasMany TicketMessage
Тут вроде все ясно. У пользователя может быть много тикетов, тикеты могут иметь много сообщений, а каждое сообщение тикета должно иметь отправителя(отправитель помечается в поле TicketMessage.from_id .
Нужно подгрузить из базы Ticket со всеми его TicketMessages, а также чтобы у TicketMessages была подгружена информация о отправителе. Но, нужна не вся информация о отправителе, а только Имя и Фамилия.

Этот код к моему удивлению в поле TicketMessage.user возвращает просто null, вместо имя и фамилии о отправителе
\Request::user()->tickets()->with('messages.user')->select('users.name', 'user_surname')->find($id);


Если изменить связь TicketMessage таким образом:
class TicketMessage
...        
public function user()
{
	 return $this->belongsTo('App\User', 'from_id')->select('name', 'surname');
}

В TicketMessage.user все равно оказывается null

Как заставить этот код нормально работать, чтобы в TicketMessage был не null, а информация о отправителе?
\Request::user()->tickets()->with('messages.user')->select('users.name', 'user_surname')->find($id);
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
@izheme
Познаю мир
Как уже верно отметили, надо не забывать про id в вашей связи. Ещё можно сделать динамически. В Laravel 5.5 и выше, можно попробовать сделать так:

\Request::user()->tickets()->with('messages.user:id,name,surname')->find($id);


Ну или типа такого:
\Request::user()->tickets()->with(['messages.user'=>function($query){
        $query->select('id', 'name', 'surname');
    }])->get();


P.S. Возможно, во всех случаях надо from_id возвращать, чтобы связь смогла разрешится. Попробовать надо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы