2015-04-17 5 views
1

Используя Laravel 5, у меня есть база данных, состоящая из пользователей, разговоров и сообщений, соединенных сводной таблицей между пользователями и диалогами, которые называются «chat_user» (и сформированы с помощью отношений BelongsToMany). Схема ниже:Laravel Eloquent querying сводные таблицы

| USERS | CONVERSATION | MESSAGES  | CONVERSATION_USER | 
| id  | id   | id    | user_id   | 
| username | timestamps | conversation_id | conversation_id | 
| password |    | user_id   |     | 
|   |    | message   |     | 

Поэтому в основном я пытаюсь использовать conversation_user, чтобы получить все conversation_ids, касающееся зарегистрированного пользователя, а затем использовать эти результаты, чтобы получить последнее сообщение, относящееся к этому разговору.

В терминах SQL это соответствует:

SELECT messages.`message` FROM conversation_user INNER JOIN messages ON 
conversation_user.conversation_id=messages.conversation_id 
WHERE conversation_user.user_id=1 ORDER BY messages.id DESC 

Однако я не могу понять, как добиться этого с красноречив!

ответ

3

Это должно работать:

$messages = Message::whereHas('conversation.users', function($q){ 
    $q->where('user_id', 1); 
})->get(); 
+0

Работает как шарм –

+0

Если я ввел еще одну таблицу в смесь под названием РАБОЧИЕ с внешним ключом в таблице разговоров называется JOB_ID, любая идея, как я мог бы использовать несколько WhereHas? –

+0

Если вы укажете связь, вы можете просто направить другой вызов 'whereHas'. Как 'Message :: whereHas ('convers.users', ...) -> whereHas ('convers.job', ...) -> get()' – lukasgeiter

Смежные вопросы