2016-12-23 8 views
0

私たちは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の限界を押し進めているかもしれないが、これを行うためのよりエレガントな方法についての提案が大好きです。

答えて

1

ユーザー定義関数は構文規則を変更できません。

ORMでデータベースごとに異なる機能を使用するか、独自のUDFをMySQLにインストールするかを選択するだけです。

+0

私は、Sqlite関数にMySQL構文を書き直そうとしているようですが、sqliteCreateFunctionは実際には作成されていません...今言及したように、雄弁を拡張するか、ビルダーマクロを使用する方が良いかもしれません。 – Fx32

関連する問題