【问题标题】:Convert raw query to Eloquent query将原始查询转换为 Eloquent 查询
【发布时间】:2018-09-12 22:09:08
【问题描述】:

我正在尝试使用 eloquent 中的原始查询获得相同的结果。这是我的表的样子:

id  sent_by message         read    received_by created_at  updated_at  

1       7   Hello Mam hello 1           1       2018-04-03 16:53:56 2018-04-03 18:20:47 
2       6   Hello Mam hello 1           1       2018-04-03 16:54:12 2018-04-03 18:20:35 
3       7   Hello Mam hello 1           1       2018-04-03 16:54:21 2018-04-03 18:20:47 
4       7   Hello Mam hello 1           1       2018-04-03 16:55:34 2018-04-03 18:20:47 
7       6   Hello Mam hello 1           1       2018-04-03 17:34:02 2018-04-03 18:20:35 
8       6   Hello Mam hello 0           1       2018-04-03 19:21:03 2018-04-03 19:21:03 

我有这个对我有用的原始查询:

SELECT * FROM `en_chat_message` 
WHERE id IN (SELECT MAX(id) AS id
             FROM `en_chat_message`  
             WHERE received_by=1 OR sent_by=1
             GROUP BY sent_by) 
ORDER BY created_at DESC

我的输出如下所示:

id sent_by message read received_by created_at updated_at

8       6   Hello Mam hello     0           1       2018-04-03 19:21:03 2018-04-03 19:21:03 
4       7   Hello Mam hello     1           1       2018-04-03 16:55:34 2018-04-03 18:20:47 

现在唯一的事情是我想将此查询转换为 eloquent 查询。我没有得到与执行模型名称相关的想法。

谢谢! (提前)

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:
    Chat::select(DB::raw('SELECT MAX(id) AS id, sent_by, message, read, received_by, created_at, updated_at'))
                    ->where('received_by', 1)
                    ->orWhere('sent_by', 1)
                    ->groupBy('sent_by')
                    ->orderBy('created_at', 'desc')
                    ->get();
    

    【讨论】:

      【解决方案2】:

      使用查询生成器:

      DB::table('en_chat_message')
          ->whereIn('id', function($query) {
              $query->selectRaw('MAX(id) id')
                  ->from('en_chat_message')
                  ->where('received_by', 1)
                  ->orWhere('sent_by', 1)
                  ->groupBy('sent_by');
          })
          ->orderByDesc('created_at')
          ->get();
      

      使用 Eloquent 模型:

      class EnChatMessage extends \Illuminate\Database\Eloquent\Model
      {
          protected $table = 'en_chat_message';
      }
      
      EnChatMessage::whereIn('id', function($query) {
          $query->selectRaw('MAX(id) id')
              ->from('en_chat_message')
              ->where('received_by', 1)
              ->orWhere('sent_by', 1)
              ->groupBy('sent_by');
          })
          ->orderByDesc('created_at')
          ->get();
      

      【讨论】:

        猜你喜欢
        • 2019-04-29
        • 1970-01-01
        • 2016-04-27
        • 2019-05-31
        • 2019-04-04
        • 2021-09-11
        • 2018-01-04
        • 2020-02-07
        • 2019-02-03
        相关资源
        最近更新 更多