如果在查询中使用MySQL函数,则在SQLite下Laravel测试失败



在我的Laravel项目中,我在我的查询中使用了一些基于MySQL的SQL函数,像这样:

Post::whereRaw('publish_at < NOW()');
SELECT * FROM posts WHERE publish_at < NOW();

或:

Post::whereRaw('TIMESTAMP(publish_date, publish_time) < NOW()');
SELECT * FROM posts WHERE TIMESTAMP(publish_date, publish_time) < NOW();

这些查询在MySQL数据库中工作得很好,但如果我试图在SQLite内存数据库中测试它们,它们会失败,因为:

no such function: NOW (SQL: ...)

我想保留MySQL函数的优点,但我不想放弃这些测试,也不想创建一个不同的函数来在测试中使用它。

也许有一些不太为人所知的Eloquent函数可以解决这些问题?

我怎么能使它工作在两个数据库吗?

CURRENT_TIMESTAMP是一种符合标准SQL的特殊语法。它就像一个常量(请注意,如果调用函数,您会期望缺少())。

SQLite支持

SQLite version 3.32.3 2020-06-18 14:16:19
sqlite> select current_timestamp;
2021-10-17 17:16:02

和MySQL:

Welcome to the MySQL monitor.  Commands end with ; or g.
Server version: 5.7.34-37-log Homebrew
mysql> select current_timestamp;
+---------------------+
| current_timestamp   |
+---------------------+
| 2021-10-17 17:16:08 |
+---------------------+

你的评论:

必然会有一些函数在不同的SQL实现之间不可移植。"便携式SQL"是一个神话。在每个SQL实现中,您总是有各种其他品牌不支持的语法特性或内置函数。

我能建议的最好的方法是使用适配器模式,这也是我在为Zend框架开发Zend::Db组件时所做的。为你想要支持的每个数据库创建一个子类,并在每个子类中以不同的方式实现每个函数。

雄辩能让你发展出更有意义的语言。方法,使基于模型的查询更加惯用。https://dev.to/rocksheep/cleaner-models-with-laravel-eloquent-builders-12h4

您将为每个品牌的数据库开发这些构建方法的单独实现。

相关内容

最新更新