gpt4 book ai didi

php - Doctrine 1.2 中的用户定义例程?

转载 作者:可可西里 更新时间:2023-11-01 08:55:03 24 4
gpt4 key购买 nike

我必须为我的 MySQL 数据库编写一个用户定义的例程(计算距离函数)。

  1. 是否可以在 yaml 模式文件中定义它?

在终端 mysql-client 中定义例程后,一切正常,直到 'doctrine build-all-reload' - 函数被删除,这是可以理解的;

  1. 如何附加一个每次运行“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 Queries 中使用 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));

感谢您的帮助。

关于php - Doctrine 1.2 中的用户定义例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6301439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com