如何在 Laravel Carbon 中使用动态间隔,以便从 mysql 开始仅 select 未来 10 天的日期

How to use a dynamic interval in Laravel Carbon in order to only select a date 10 days in the future from mysql

我需要从列中获取数据库结果,其中问题 answered_at(日期)本身加上一些天数。我尝试了很多使用 Carbon 和 mysql INTERVAL 的方法,但我被语法困住了。

我正在使用 Laravel 6 和 Carbon。

我有一个名为 "questions" 的 table,我想从那里得到一个问题的 ID,该问题是 answered_at 某个日期加上我有的天数在另一个名为 "repeat".

的专栏中

像这样:

->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))

但是,我不能只写 "repeat",因为它不会将其识别为 table。如果我在里面写一个数字,它就会起作用。

这个有效:

->where( 'answered_at', '<', Carbon::now()->subDays(10))

但是由于添加到日期的动态天数来自数据库,我必须将其作为动态字段。我试图在查询之前获取它,并将其用作 $variable,但是 - 这会创建两个不同的 mysql-queries,这意味着性能不佳。

所以我希望它能工作,但是我无法理解语法:

->where( 'answered_at', '<', Carbon::now()->subDays('COLUMN_REPEAT_FROM_DB'))

我也试过这个:

->whereRaw("DATE_ADD(answered_at, INTERVAL 10 DAY) <= NOW()")

这有效,但 INTERVAL 10 DAY 然后被硬编码并且

->whereRaw("DATE_ADD(answered_at, INTERVAL 'repeat' DAY) <= NOW()")

也不起作用..语法!

整个查询如下所示:

$question = \DB::table('questions')
     ->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))
     ->value('answered_at');

(我得到 answered_at 作为值只是为了查看哪个日期出来以便对其进行测试,稍后将更改为 id 并传递给另一个函数)。

非常感谢任何指点!

您上次的查询是正确的,但是您使用了错误的引号。

您应该使用反引号来指定列名:

$query->whereRaw("DATE_ADD(answered_at, INTERVAL `repeat` DAY) <= NOW()")

或者,您可以使用此查询获得相同的结果:

$query->whereRaw("DATEDIFF(NOW(), answered_at) >= `repeat`")

虽然,计算本身似乎是错误的。如果你想 select 具有当前日期 answered_at + repeat DAYS 间隔内的行,那么它应该是 >= 在你的查询和 <= 在我的