Как в LeftJoin добавить аддитивный параметр? - PullRequest
0 голосов
/ 29 декабря 2018

В моем приложении laravel 5.7 / eloquent / Mysql 5.5 мне нужно в списке чатов получить значения сообщений любого чата и еще 1 столбец сообщений любого чата для данного пользователя ($ user_id):

Iпробовал как:

$chats          = Chat
     ::select( \DB::raw( ' chats.*, count(cm.id) as messages_count, count(cmu.id) as user_messages_count' ) )
    ->orderBy('name', 'asc')
    ->groupBy('chats.id')
    ->leftJoin( \DB::raw('chat_messages as cm'), \DB::raw('cm.chat_id'), '=', \DB::raw('chats.id') )
    ->leftJoin( \DB::raw('chat_messages as cmu'), \DB::raw(' cmu.chat_id = chats.id and cmu.chat_id = ' .$user_id ) )
    ->get();    

Но ошибка:

 Column not found: 1054 Unknown column '' in 'on clause'.

Похоже, выражение leftJoin нельзя использовать с параметром пустого значения.Или как-то иначе?

$chats          = Chat
     ::select( \DB::raw( ' chats.*, count(cm.id) as messages_count, count(cmu.id) as user_messages_count' ) )
    ->orderBy('name', 'asc')
    ->groupBy('chats.id')
    ->leftJoin( \DB::raw('chat_messages as cm'), \DB::raw('cm.chat_id'), '=', \DB::raw('chats.id') )
    ->leftJoin(\DB::raw('chat_messages as cmu'), \DB::raw('cmu.chat_id'), '=', \DB::raw('chats.id'))
    ->where( 'cmu.user_id', $user_id)
    ->get();    // `chat_messages` ORDER BY `chat_id` A

Это работает, но не правильно, как для условия

>where( 'cmu.user_id', $user_id)

Пропускается левое соединение и пропускаются строки с user_messages_count = 0, но они мне нужны.

Какой правильный путь?

Спасибо!

1 Ответ

0 голосов
/ 29 декабря 2018

Вам не нужно выходить из системы более одного раза. Chat_messages.Предложение WHERE в этом случае бесполезно.LEFTJOIN работает со столбцами в объединенных таблицах.

$chats= Chat ::select( \DB::raw( ' chats.*, count(cm.id) as 
messages_count, sum(if(cm.user_id='.$user_id.',1,0)) as user_messages_count' ) )
->orderBy('name', 'asc')
->groupBy('chats.id')
->leftJoin( \DB::raw('chat_messages as cm'), \DB::raw('cm.chat_id'), '=', \DB::raw('chats.id') )
->get();    // `chat_messages` ORDER BY `chat_id` A
...