如何在 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
间隔内的行,那么它应该是 >=
在你的查询和 <=
在我的
我需要从列中获取数据库结果,其中问题 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
间隔内的行,那么它应该是 >=
在你的查询和 <=
在我的