php - Eloquent - 如何在 SQL 中不出现引号并破坏它的情况下执行 "where"操作?

标签 php mysql laravel eloquent

这是 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()) - 间隔 100 天”周围的引号

这是一个语法错误,应该是:

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'))...

这将创建一个 Laravel 不会用引号引起来的表达式对象。或者,我们可以使用查询生成器的 whereRaw() 方法:

$query->whereRaw('plays.created_at >= DATE(NOW()) - INTERVAL ? DAY', [ $periodDays ])...

whereRaw() 方法允许我们将参数绑定(bind)到原始查询以避免 SQL 注入(inject)攻击。

关于php - Eloquent - 如何在 SQL 中不出现引号并破坏它的情况下执行 "where"操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47424297/

相关文章:

php - 如何使用 <select> 标记中的嵌套项目列表来减少数据库查询量?

php - Android无法执行restful url

php - Alamofire Swift 3 + PHP 上传图片不工作

mysql - HiveQL 中的 AVG - 当我尝试获取列的平均值时出错

php - php 中的 mysql_escape_string

mysql触发器信息从一对多关系插入和更新触发器

php - Laravel Eloquent 添加自定义查询元素

PHP 获取相对于站点根目录的文档路径

php - 即使没有条件,Laravel QUERY 也不会产生任何结果

php - EC2 上的 Laravel 存储/框架/ session 无法打开流