Laravel Eloquent MySQL DateTime 字段更新与 Interval 给出错误

Laravel Eloquent MySQL DateTime field update with Interval gives an error

提问人:dgpro 提问时间:9/21/2023 最后编辑:dgpro 更新时间:9/21/2023 访问量:59

问:

我正在尝试通过使用间隔添加 1 天来更新所有记录的 DateTime 字段,就像这样雄辩

TestModel::update(['date' => \DB::raw('DATE_ADD(date, INTERVAL 1 DAY)')]);

但是我收到这个错误

Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1 near "1": syntax error (SQL: update "test" set "date" = DATE_ADD(date, INTERVAL 1 DAY))

如果我直接在 MYSQL 中使用此查询(使用 HeidiSQL),如果我删除表和字段名称周围的引号,它就可以工作,这没有意义。

update test set date = DATE_ADD(date, INTERVAL 1 DAY)

我也尝试过不使用函数,但发生了同样的错误DATE_ADD

\DB::raw('date + INTERVAL 1 DAY')

在字段周围添加引号没有任何区别。

对插入、删除、更新操作的所有其他查询都可以正常工作。 我在这里检查了类似的问题,这似乎是雄辩的正确格式,那么这里有什么问题呢?

Laravel 5.8 (我知道它已经过时了)
MySQL 8.0.34
PHP 7.4

更新:它在使用 SQLite 的单元测试中给出错误,并且不支持 INTERVAL

MySQL Laravel DateTime 雄辩 间隔

评论

0赞 Álvaro González 9/21/2023
我无法了解确切的规则,文档也没有阐明它,但我经常发现 MySQL 中的表达式会触发语法错误,除非引用该图。所以值得一试,而不是.您可以先在自己喜欢的MySQL客户端中尝试此操作。INTERVALINTERVAL '1' DAYINTERVAL 1 DAY
0赞 fajar wz 9/21/2023
如果你使用(在LaRavel中执行普通的MySQL查询)怎么办?\DB::statement()
0赞 Bagus Tesa 9/21/2023
最好不要将 eloquentlaravel-query-builder 混用,因为 eloquent 倾向于使用准备好的语句,并且可能会将您的参数绑定为字符串。尝试转储实际执行的查询。
0赞 dgpro 9/21/2023
我试过使用语句。但我只是认为它在使用 sqlite 的单元测试中失败了,并且它不支持间隔
0赞 Georg Richter 9/21/2023
你有没有试过把日期放在引号里?测试模型::update(['date' => \DB::raw('DATE_ADD(, 间隔 1 天)')]);"date"

答:

0赞 Othmane Nemli 9/21/2023 #1

我认为你应该使用反引号(不是因为是保留字,而是通常用反引号包装列)date

TestModel::update(['date' => \DB::raw('DATE_ADD(`date`, INTERVAL 1 DAY)')]);

评论

0赞 dgpro 9/21/2023
感谢您的建议,但正如我所提到的,任何类型的报价都没有任何区别。问题出在用于单元测试的 SQLite 上,它不支持INTERVAL
0赞 Othmane Nemli 9/22/2023
@dgpro,我认为这会对您有所帮助:bannister.me/blog/using-mysql-and-postgres-functions-in-sqlite