私たちはLaravelプロジェクトのメインデータベースとしてMySQLを使用しています。PDO :: sqliteCreateFunctionを通じてsqlliteでtimestampdiffを実装する
Laravelは、テストを分離して高速に保つために、デフォルトで機能/受入れテストのためのファクトリ/シーダーと組み合わされたメモリ内のsqliteを使用します。私たちは現在、モックを使用して小さなユニットテストを可能な限り作成しようとしていますが、これらの小さなsqliteインスタンスを起動し、seeInDatabase()
のようなLaravelテスト関数を使用する古い "機能"テストも数百もあります。
LaravelのEloquent ORMは、データベース機能を抽象化するのにはかなり優れていますが、デフォルトではsqliteが提供していない機能がいくつかあります。
私たちのコードベースにいくつかのよく使われるMySQLの機能をサポートするために、このPDO methodを使用してsqliteの機能を拡張しようとしている:
$pdo->sqliteCreateFunction('timestampdiff', function($unit, $start, $end){
return ...
});
私は(私はすでに実装されてきたUDFを実装する方法を理解します三角関数、正規表現、日付付けなど)。
timestampdiff
に渡される最初のパラメータは、MINUTE
またはYEAR
のような引用符で囲まれていない平らなラベルです。
このパラメータは、sqliteによって列として解釈されます。 MySQLのdate_add()
を偽っても問題はありません。その関数の3番目のパラメータは空白で引用されていません(INTERVAL 2 HOUR
など)。
floorestとunix_timestampの両方がsqliteCreateFunction
によって作成可能であるため、timestampdiffクエリをfloor((unix_timestamp(end) - unix_timestamp(start))/60)
に置き換えるのが現在の最善の取り組みです。
このすべては非常にハッキリです。私はここでPHP/PDO/sqliteの限界を押し進めているかもしれないが、これを行うためのよりエレガントな方法についての提案が大好きです。
私は、Sqlite関数にMySQL構文を書き直そうとしているようですが、sqliteCreateFunctionは実際には作成されていません...今言及したように、雄弁を拡張するか、ビルダーマクロを使用する方が良いかもしれません。 – Fx32