如何在LeftJoin中添加附加参数?

时间:2018-12-29 11:41:41

标签: mysql laravel-5 eloquent left-join

在我的laravel 5.7 /雄辩/ Mysql 5.5应用中,我需要在聊天列表中 对于给定的useronly($ user_id),获取任何聊天消息的值以及任何一次聊天消息的1列:

我尝试过:

$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 :(得分:0)

您无需多次退出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