为什么列别名在学说中不起作用?

时间:2010-09-09 10:25:05

标签: php sql doctrine

我的脚本是这样的:

$query = Doctrine_Query::create ()
  ->select('count(p.product_id) as num_a')              
  ->from ( 'ProductComments p' )
  ->groupBy('p.product_id')
  ->having('num_a =2 ');

生成的sql是:

SELECT COUNT(i.product_id) AS i__0 FROM productcomments i GROUP BY i.product_id HAVING num_a=2

因此我在执行sql时遇到错误。

我有两个问题:

  1. 为什么表'i'的别名代替'p'

  2. 为什么'num_a'中的'i__0'未被{{1}}替换,如何解决?

  3. 感谢您的建议......

3 个答案:

答案 0 :(得分:8)

  

1:为什么表'i'的别名   而不是'p'?

     

2:为什么'num_a'   在没有替换的条款中   'i__0',如何解决?

这两个问题都得到了简单回答:Doctrine使用它自己的别名进行查询。您不需要知道这些别名,因为它们不会影响您,也不需要使用它们。

即使Doctrine为别名i__0命名,您也可以使用自定义别名访问该属性,例如: $yourObject->num_a将具有正确的值,即count(p.product_id)的结果。

要查看查询的输出是一个有用的调试功能,但依赖于应用程序内部是没有意义的,因为这些值仅用于Doctrine的内部机制。

答案 1 :(得分:8)

我在设置别名时遇到了问题。 我必须设置别名,然后使用该别名的“ORDER BY”。 以下解决方案为我工作:

$myQuery->addSelect('(<my select>) AS my_alias');
$myQuery->orderBy('my_alias');

在结果查询中看起来像“...()AS p_0 ... ORDER BY p_0”。 我希望它会帮助别人。

答案 2 :(得分:1)

这不是有效的SQL。

SQL标准状态,SELECT将在 having后逻辑执行。因此,您需要在having中重复别名代码。

好建议。只要您使用SQL消费DB就尽可能地与SQL保持一致。