laravel - 如何在 Laravel Carbon 中使用动态间隔以便仅从 mysql 中选择未来 10 天的日期
问题描述
我需要从列中获取问题被回答的日期(日期)本身加上几天的数据库结果。我已经尝试了很多使用 Carbon 和 mysql INTERVAL,但我被语法困住了。
我正在使用 Laravel 6 和 Carbon。
我有一个名为“问题”的表,从那里我想得到一个在某个日期被回答的问题的 ID,再加上我在另一个名为“重复”的列中的天数。
像这样的东西:
->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))
但是,我不能只写“重复”,因为它不会将其识别为表格。如果我在那里写一个数字,它确实有效。
这有效:
->where( 'answered_at', '<', Carbon::now()->subDays(10))
但由于添加到日期的动态天数来自数据库,因此我必须将其作为动态字段。我试图在查询之前获取它,并将其用作 $ 变量,但是 - 这会创建两个不同的 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`")
不过,计算本身似乎是错误的。如果您想选择当前日期在 answered_at + repeat DAYS
区间内的行,那么它应该>=
在您的查询和<=
我的查询中。
推荐阅读
- node.js - 快速路由 - 如何要求包含基于 URL 参数的路由的文件?
- vue.js - 调整 vuetify 项目的高度
- kubernetes - 我可以获得比一次重启前更旧的容器日志吗?
- java - 什么端口使用stomp协议?
- javascript - 使用同步发送一个道具并在孩子中使用 v-model 绑定它
- python - ADB 方法使用 python adb.devices() 冻结
- node.js - 如何在节点 ejs 中显示来自动态路径的图像
- java - 持久的 Google 登录 Android Studio
- python - 如何检测不和谐的用户流活动更新(discord.py)
- javascript - 在所有文件中全局导入 ReactJS 组件