通过PDO :: sqliteCreateFunction在sqllite中实现timestampdiff

时间:2016-12-23 13:10:17

标签: php mysql sqlite unit-testing pdo

我们使用MySQL作为Laravel项目的主要数据库。

Laravel默认使用内存中的sqlite与工厂/播种器进行功能/验收测试,以保持测试的隔离和快速。我们目前正在尝试尽可能多地使用模拟编写小型单元测试,但我们还有几百个较旧的“功能”测试,它们启动这些小型sqlite实例并使用Laravel测试函数,如seeInDatabase()

Laravel的Eloquent ORM非常擅长抽象数据库函数,但是有一些sqlite默认不提供的功能。

我正在尝试使用此PDO method扩展sqlite功能,以支持我们的代码库中常用的一些MySQL函数:

$pdo->sqliteCreateFunction('timestampdiff', function($unit, $start, $end){
    return ...
});

我理解如何实现UDF(我已经实现了trig函数,regex,datediff等)。

问题是传递给timestampdiff的第一个参数是一个单位,一个不带引号的普通标签,如MINUTEYEAR

此参数由sqlite解释为列。伪造MySQL date_add()也是有问题的,因为该函数的第三个参数没有引用空格,如INTERVAL 2 HOUR

我目前的最大努力是用floor((unix_timestamp(end) - unix_timestamp(start))/60)替换timestampdiff查询,因为floor和unix_timestamp都可以通过sqliteCreateFunction创建。

尽管如此,这一切都让人非常讨厌。我意识到我可能会在这里推动PHP / PDO / sqlite的限制,但是会更喜欢以更优雅的方式来做这些建议。

1 个答案:

答案 0 :(得分:1)

用户定义的函数无法更改语法规则。

您唯一的选择是让ORM为不同的数据库使用不同的功能,或者在MySQL中安装自己的UDF。