2010-10-04 69 views
2

我是新来的Doctrine,但有点熟悉SQL。我有一个非常简单的用户和挑战模式。每个挑战都有一个“挑战者ID”和一个“对手ID”,它们是外键进入用户表。我想打印所有挑战的列表,输出是用户表中的名称。这是我的学说查询;只有返回一行的原则查询?

$q = Doctrine_Query::create() 
     ->select('u1.name challenger, u2.name opponent') 
     ->from('Challenge c') 
      ->leftJoin('c.Challenger u1') 
      ->leftJoin('c.Opponent u2'); 

问题是这只返回一行。我用getSqlQuery()命令来查看生成的SQL这最终是:

SELECT u.name AS u__0, u2.name AS u2__1 FROM challenge c 
LEFT JOIN user u ON c.challenger_id = u.id 
LEFT JOIN user u2 ON c.opponent_id = u2.id 

预期当第三方SQL客户端运行此查询检索所有行。任何想法如何从Doctrine获得所有行?我使用的是$q->execute(),我知道它应该适用于多行。

谢谢。

+3

尝试$ q-> count()并查看它得到的行数。另外,使用 _dev.php来访问查询。运行后,单击数据库并查看它实际正在运行的查询。我不确定这与getSqlQuery()会返回什么不同。 – gregghz 2010-10-04 00:41:33

+0

谢谢。 $ q-> count()暴露了查询返回了正确数量的结果,并且我需要阅读正确使用DoctrineCollection对象。这超出了我的问题的范围,所以我会将其关闭。 – LVB 2010-10-04 01:02:49

+1

太棒了,欢迎您将我的评论标记为“很棒”的评论;) – gregghz 2010-10-04 02:28:51

回答

2

我刚刚遇到了这个问题,在我的情况下,问题是我的查询没有从FROM表中选择任何字段。示例:

$query = Doctrine_Query::create() 
      ->select(
       'ghl.id as id, 
       ghl.patbase_id as patbase_id, 
       ghl.publication_no as publication_no, 
       ghl.priority_no as priority_no 
       ' 
      ) 
      ->from('GridHitListContents ghlc') 
      ->leftJoin('ghlc.GridHitList ghl') 

正如您所看到的,GridHitListContents表中没有选定的字段。 与$ query-> count()我得到2000ish结果,但与$ query-> fetchArray()只有第一个。 当我加入

$query = Doctrine_Query::create() 
      ->select(
       'ghlc.id, 
       ghl.id as id, 
       ... 
       ' 
      ) 
      ->from('GridHitListContents ghlc') 
      ->leftJoin('ghlc.GridHitList ghl') 

我收回了我的所有结果。

+1

这也解决了我的问题。 我在我的SQL中运行了一个'table。*',但是它结合了结果并返回了一行。包含'table.id AS table_id,table。*'作为select返回所需的每一行。 – frodosghost 2017-10-06 02:32:53

5

对我来说,它的工作由chaning水化模式:设置,那么

$result = $query->execute(array(), Doctrine_Core::HYDRATE_SCALAR); 

结果集返回数组,而不是对象。

+0

我做到了这一点,它的工作原理,但所有的领域成为我选择的第一个表的别名的前缀。 – shousper 2012-09-14 06:12:44

0

使用此$result = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY)

1

$query->fetchOne()工作对我罚款。