给定一个查询,如何找到生成它的ORM方法


Given a query, how do I find the ORM method that generated it?

我们在多个项目中使用Cake和Symfony,以及Doctrine ORM。在我们的代码库中,很少有地方在代码中写出实际的SQL查询——我们让ORM库来完成繁重的工作。

现在,我的IT人员从MySQL慢速查询日志中给了我100mb的文件,我需要找到这个查询是在哪里创建的。我在代码库中为特定字段尝试了各种递归grep,得到了几十个(如果不是几百个的话)文件,或者空手而归。例如:

cd ~/webproject
grep -r -E 'field1.*field2.*field3' .

find . -name '*.php' -print | xargs grep -E 'field1.*field2.*field3'

你有什么更好的建议、技巧或技术可以用来追踪与特定的最终"渲染"SQL语句相关的文件、控制器或ORM模型方法吗?

这里有一个你可以使用的技巧。我不熟悉Doctrine或Cake ORM,但它可以很容易地用一般的术语来描述——我使用Propel,我相信它可以做到这一点。

只需在所有查询中添加一个自定义WHERE子句,如下所示(视情况而定,将方法名称替换为自己的方法名称)。1 = 1实际上是一个no-op,它本身不应该影响查询性能,并允许您引入一个方便的注释:

$query->addCustomWhere(
    '1 = 1 /* ' . __CLASS__ . '::' . __FUNCTION__ . ' */'
);

然后,所有记录的查询都会在注释中的类/函数旁边。当然,您可以为此编写一个辅助方法,只需传入查询和神奇的变量,就可以省去每次都要写出它的麻烦。