代码之家  ›  专栏  ›  技术社区  ›  John Little

雄辩-如何做到“where”而不在SQL中出现引号并破坏它?

  •  1
  • John Little  · 技术社区  · 8 年前

    以下是拉雷维尔代码:

    $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
    

    你知道我该如何雄辩地删除最后日期部分的引号以便执行吗?

    我特别需要使用 now() 在DB中,我希望它与数据库时区设置相关,而不是当前客户端使用的任何设置,因此使用Carbon等不是一个选项。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Cy Rossignol Albert    8 年前

    我们需要使用 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() 方法允许我们将参数绑定到原始查询,以避免SQL注入攻击。