Activerecord 扩展spreep以模拟数据库功能

Activerecord 扩展spreep以模拟数据库功能,activerecord,orm,propel,Activerecord,Orm,Propel,我需要将一个应用程序从MySQL转换为SQL Server 有许多涉及MySQL数据库函数的硬编码查询,如NOW(),LCASE(),MATCH()对(),这些查询在SQL Server中具有相同的功能,但具有不同的语法和结构 我选择推进,因为它似乎很容易使用 我正在寻找一种通过扩展类来模拟数据库函数的方法,如NOW(){MySQL}和GETDATE(){sqlserver} 我是这样想的: $result = Function::NOW(); // MySQL $result = Functi

我需要将一个应用程序从MySQL转换为SQL Server

有许多涉及MySQL数据库函数的硬编码查询,如NOW()LCASE()MATCH()对(),这些查询在SQL Server中具有相同的功能,但具有不同的语法和结构

我选择推进,因为它似乎很容易使用

我正在寻找一种通过扩展类来模拟数据库函数的方法,如NOW(){MySQL}和GETDATE(){sqlserver}

我是这样想的:

$result = Function::NOW(); // MySQL
$result = Function::GETDATE(); // SQL Server
$table = new MyTable();
$result = Function::LCASE($table->getName()); // MySQL
$result = Function::LOWER($table->getName()); // SQL Server
当函数接受参数时,如LCASE(){MySQL}或LOWER(){SQL Server},可能是这样的:

$result = Function::NOW(); // MySQL
$result = Function::GETDATE(); // SQL Server
$table = new MyTable();
$result = Function::LCASE($table->getName()); // MySQL
$result = Function::LOWER($table->getName()); // SQL Server

如果我能从不同的数据库(MySQL和SQL Server)中创建两个具有相同用途的函数之间的等价性,那将是一个完美的解决方案


因此,我可以在PHP代码中使用函数::HASHBYTES(),而不是使用函数::MD5(),因为它更简单,并且当我的应用程序连接到SQL Server数据库时,在内部调用HASHBYTES()。

所以需要一些东西来使用spreep抽象数据库函数。但是,这不是推进的作用吗?你想要的是添加提取功能?我看这里没有问题。。。它是什么?听起来你有一个计划(虽然我不太清楚为什么你需要
函数::ETCETC()
而不是使用PHP函数。没有名为“Function”的类在spreep中,这只是一个我认为有用的例子。我想spreep不会抽象数据库函数,如果需要,可以在单引号内传递计数(fieldname),类似于普通查询。应用程序通常比较复杂,如果您需要更复杂的查询,即使使用了Prope,也需要使用硬编码的查询片段。请参阅Prope网站的以下代码:$nbComments=ArticleQuery::create()->join('Comment')->withColumn('count(Comment.ID)','nbComments'))->groupBy('Article.Title')->select(array('Article.Title',nbComments')->find();查看函数“count()”。如果此函数是“now()”,则需要将其重写为“getdate()”将我的应用程序迁移到SQL Server时,数据库之间的主要区别是数据库功能。如果我能抽象它们,我就可以轻松地为MySQL编写应用程序并迁移到另一个数据库,如SQL Server或Oracle,而无需接触源代码(重写查询).关于问题所在,我是Propel的新手,我对它几乎一无所知。我需要的是一种抽象数据库函数的方法,但我不知道如何在Propel中实现它。