2016-08-12 45 views
0

我想建立查询在laravel后5内建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; 

错误信息:

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

请帮帮我。

+0

是你的$ BEGIN_TIME和$ END_TIME字符串或碳日期?你也应该使用绑定参数而不是连接字符串来插入变量,这样你会更安全,并且你将避免你在这里可能遇到的问题,在whereRaw语句中缺少' – rypskar

回答

0

当您编写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(); 
0

或者这应该工作太:

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 
    ] 
);