如何解决在Doctrine 1.2中用户定义的例程?
| 我必须为我的MysqL数据库编写一个用户定义的例程(计算距离函数)。 是否可以在yaml模式文件中定义它? 在终端MysqL-client中定义例程后,一切正常,直到\ doctrine build-all-reload \'-函数被删除,这是可以理解的; 如何附加每次运行\'build-all-reload \'都会执行的sql脚本? 对不起我的英语不好。 汤姆解决方法
通过在我的doctrine.php文件中添加以下几行,我找到了一个解决方案(在某种程度上类似于您的解决方案):
$q = file_get_contents(\'../configs/sql/routines.sql\');
$conn = Doctrine_Manager::connection();
$conn->execute($q);
现在,每次执行./doctrine build-all-reload时,都会执行以下脚本:
DROP FUNCTION IF EXISTS DIST;
CREATE FUNCTION DIST (fi11 DOUBLE,ksi11 DOUBLE,fi22 DOUBLE,ksi22 DOUBLE)
RETURNS DOUBLE
DETERMINISTIC
BEGIN
DECLARE d DOUBLE;
DECLARE fi1 DOUBLE;
DECLARE fi2 DOUBLE;
DECLARE ksi1 DOUBLE;
DECLARE ksi2 DOUBLE;
SET fi1 = PI()*(fi11)/180;
SET fi2 = PI()*(fi22)/180;
SET ksi1 = PI()*(ksi11)/180;
SET ksi2 =PI()*(ksi22)/180;
SET d = ACOS((SIN(fi1)*SIN(fi2))+(COS(fi1)*COS(fi2)*COS((ksi1-ksi2))))*6371.0;
RETURN d;
END;
这个解决方案可能并不优雅,但对我有用:)
我不打算从MySQL更改数据库。
之后,我可以在“ Doctrine查询”中使用DIST函数,并且它的工作速度比使用标准内置函数的实现快几倍,并且要短得多。
$q->where(\'DIST(a.lan,a.lon,b.lan,b.lon) < ?\',array(2.0));
代替
$q->where(\'ACOS((SIN(...)... ... wrrrr ;-P ))*6371.0 < ?\',array(2.0));
谢谢你的帮助。
, 我认为这可以通过教义行为来完成。
按照我自己的博客文章http://darrendev.blogspot.com/2010/03/creating-doctrine-custom-behaviour-part.html,但是使用setUp()而不是setTableDefinition(),您将使用以下代码创建文件:
class DarrenTestable extends Doctrine_Template{
public function setUp(){
...
}
}
...是您可以影响表创建的地方。您可以通过以下方式在yaml文件中附加此行为:
ActsAs:
DarrenTestable
在\“ ... \”部分中可能有一种精巧的方法来执行所需的操作,但是在对源代码进行一些检查之后,我不确定,因此,因为该操作仅在代码中执行一次在您的应用程序的生命周期内,我个人将在Doctrine之外进行所有操作:
连接到MySQL
发送SQL创建函数
断开
附言另一种方法是将PHP中的距离计算函数编写为一种原则行为(扩展Doctrine_Record_Listener);作为奖励,您可以获得数据库的可移植性。但是它将代码与Doctrine联系在一起,因此其他应用程序无法像使用mysql例程那样使用该函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。