【问题标题】:How In LeftJoin to add additive parameter?如何在 LeftJoin 中添加附加参数?
【发布时间】:2018-12-29 11:41:40
【问题描述】:

在我的 laravel 5.7 / eloquent/ 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)

left join 被跳过,user_messages_count = 0 的行被跳过,但我需要它们。

正确的方法是什么?

谢谢!

【问题讨论】:

  • 不懂口才。但这是Sql中的一个常见陷阱。使用 LEFT JOIN 时,然后在 WHERE 子句中使用连接表的条件,那么它将不再返回不匹配的记录。所以它变得类似于 INNER JOIN。在 SQL 中,有一种方法可以解决这个问题,将该条件放入 LEFT JOIN 的 ON 子句中。
  • 可能只是一个错字,但您似乎缺少最后一个单引号: ->leftJoin( \DB::raw('chat_messages as cmu'), \DB::raw(' cmu .chat_id = chats.id 和 cmu.chat_id = ' .$user_id )
  • 查看文档(“Advanced Join Clauses”):laravel.com/docs/queries#joins
  • COUNT(CASE WHEN cmu.user_id=? THEN 1 ELSE NULL END)? 是用户 ID)是否可以解决您的问题?

标签: mysql laravel-5 eloquent left-join


【解决方案1】:

您无需多次离开加入 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

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 2013-01-29
    • 2011-09-15
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    相关资源
    最近更新 更多