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

4nkexdtk  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(412)

在我的laravel5.7/eloquent/mysql 5.5应用程序中,我需要在chats列表中获取任何聊天记录的消息值,并为给定的useronly($user\u id)再获取一列任何聊天记录的消息:
我试着:

$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'.

看起来for 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)

左联接被跳过,用户消息数为0的行被跳过,但我需要它们。
哪条路对?
谢谢!

j2cgzkjk

j2cgzkjk1#

你不需要加入一次以上的聊天信息。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

相关问题