我需要从一列中获取问题答案本身为(date)加上几天的数据库结果。我已经尝试了很多使用Carbon和mysql INTERVAL的方法,但是我在语法上陷入了困境。
我正在使用Laravel 6和Carbon。
我有一个名为“ questions”的表,从那里我想获得在某个日期回答的问题的ID,加上我在另一列“ repeat”中所拥有的天数。
类似这样的东西:
->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))
但是,我不能只写“ repeat”,因为它不能将其识别为表格。如果我在那儿写一个数字,它实际上可以工作。
此作品:
->where( 'answered_at', '<', Carbon::now()->subDays(10))
但是由于要添加到日期的动态天数来自数据库,因此我必须将其作为动态字段。我试图在查询之前获取它,并将其用作$ variable,但这会创建两个不同的mysql查询,这将意味着性能不佳。
所以我希望这可以正常工作,但是我无法弄清楚语法:
->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');
((我得到的是Answer_at作为值,只是为了查看要测试哪个日期,稍后将更改为id并传递给另一个函数)。
高度赞赏任何指针!
您上一次查询的方式正确,但使用了错误的引号。
您应该改用反引号,以指定列名:
$query->whereRaw("DATE_ADD(answered_at, INTERVAL `repeat` DAY) <= NOW()")
或者,您可以以相同的结果使用此查询:
$query->whereRaw("DATEDIFF(NOW(), answered_at) >= `repeat`")