【问题标题】:Build complex query in laravel 5在 laravel 5 中构建复杂查询
【发布时间】:2016-08-12 07:41:01
【问题描述】:

我想在 laravel 5 之后构建查询

SELECT * FROM tbl WHERE updated_at IN (
   SELECT max(updated_at) FROM tbl
   WHERE created_at BETWEEN $begin_time AND $end_time 
   GROUP BY ip_address)

我的代码:

$sqlStr = self::select('*')
        ->whereIn('updated_at', function($query){
                         return $query->select(self::raw('max(updated_at)'))
                             ->whereRaw('created_at >= $begin_time)
                             ->whereRaw('created_at <= $end_time)
                             ->groupBy('ip_address');
})->toSql();
var_dump(($sqlStr));die;

错误信息:

Grammar.php 第 58 行中的 ErrorException:
strtolower() 期望参数 1 是字符串,给定对象

请帮帮我。

【问题讨论】:

  • 你的 $begin_time 和 $end_time 是字符串还是 Carbon 日期?此外,您应该使用绑定参数而不是连接字符串来插入变量,这样您将更加安全,并且您将避免在 whereRaw 语句中缺少 ' 时可能遇到的问题

标签: mysql laravel-5


【解决方案1】:

当您编写 self::raw('max(updated_at)') 时,生成的 SELECT max(updated_at) FROM tbl 已经在 select 命令中。以下代码将起作用:

$sqlStr = self::select('*')
    ->whereIn('updated_at', function($query) {
        $query->selectRaw('max(updated_at)')
            ->from('tbl')
            ->whereRaw('created_at >= $begin_time')
            ->whereRaw('created_at <= $end_time')
            ->groupBy('ip_address');
})->toSql();

【讨论】:

    【解决方案2】:

    或者这也应该起作用:

    DB::select(
        'SELECT * FROM tbl WHERE updated_at IN (' .
            'SELECT max(updated_at) FROM tbl ' .
            'WHERE created_at BETWEEN :begin_time AND :end_time ' .
            'GROUP BY ip_address '
        ')',
        [
            'begin_time' => $begin_time,
            'end_time' => $end_time
        ]
    );
    

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 2014-12-11
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2015-12-21
      • 2017-05-10
      相关资源
      最近更新 更多