Eloquent - 如何做 "where" 而引号不出现在 SQL 中并破坏它?
Eloquent - how to do "where" without the quotes appearing in the SQL and breaking it?
这里是 Laravel 代码:
$plays_in_period = $partner->plays()->where('plays.created_at', '>=','DATE(now()) - interval '.$periodDays.' day')->count();
这里是 SQL 这会产生:
select count(*) as aggregate
from `plays` inner join `promotion` on `promotion`.`id` = `plays`.`promotion_id`
where `promotion`.`partner_id` = 1
and `plays`.`created_at` >= 'DATE(now()) - interval 100 day'
注意 'DATE(now()) - interval 100 day'
周围的引号。
这是语法错误,应该是:
select count(*) as aggregate
from `plays`
inner join `promotion` on `promotion`.`id` = `plays`.`promotion_id` where `promotion`.`partner_id` = 1
and `plays`.`created_at` >= date(now()) - interval 100 day
有什么想法可以让 eloquent 删除最后日期部分周围的引号以便执行吗?
我特别需要在数据库中使用 now()
,因为我希望它与数据库时区设置相关,而不是当前客户端使用的任何内容,所以使用 Carbon 等不是一个选项。
我们需要使用 DB::raw()
helper 传递原始查询段:
$query->where('plays.created_at', '>=', DB::raw('DATE(NOW()) - INTERVAL ' . $periodDays . ' DAY'))...
这会创建一个 expression 对象,Laravel 不会用引号引起来。或者,我们可以使用查询构建器的 whereRaw()
方法:
$query->whereRaw('plays.created_at >= DATE(NOW()) - INTERVAL ? DAY', [ $periodDays ])...
whereRaw()
方法允许我们将参数绑定到原始查询以避免 SQL 注入攻击。
这里是 Laravel 代码:
$plays_in_period = $partner->plays()->where('plays.created_at', '>=','DATE(now()) - interval '.$periodDays.' day')->count();
这里是 SQL 这会产生:
select count(*) as aggregate
from `plays` inner join `promotion` on `promotion`.`id` = `plays`.`promotion_id`
where `promotion`.`partner_id` = 1
and `plays`.`created_at` >= 'DATE(now()) - interval 100 day'
注意 'DATE(now()) - interval 100 day'
周围的引号。
这是语法错误,应该是:
select count(*) as aggregate
from `plays`
inner join `promotion` on `promotion`.`id` = `plays`.`promotion_id` where `promotion`.`partner_id` = 1
and `plays`.`created_at` >= date(now()) - interval 100 day
有什么想法可以让 eloquent 删除最后日期部分周围的引号以便执行吗?
我特别需要在数据库中使用 now()
,因为我希望它与数据库时区设置相关,而不是当前客户端使用的任何内容,所以使用 Carbon 等不是一个选项。
我们需要使用 DB::raw()
helper 传递原始查询段:
$query->where('plays.created_at', '>=', DB::raw('DATE(NOW()) - INTERVAL ' . $periodDays . ' DAY'))...
这会创建一个 expression 对象,Laravel 不会用引号引起来。或者,我们可以使用查询构建器的 whereRaw()
方法:
$query->whereRaw('plays.created_at >= DATE(NOW()) - INTERVAL ? DAY', [ $periodDays ])...
whereRaw()
方法允许我们将参数绑定到原始查询以避免 SQL 注入攻击。