2010-03-19 152 views
0

我有一个使用symfony 1.4(我认为它使用的是教条1.2)的教条的一个小问题。我有2个查询,在mysql控制台中使用raw sql,他们产生相同的结果集。查询可以使用以下代码生成:学说问题 - 不同的查询,相同的结果,但不与学说

$dates = Doctrine::getTable('Picture') 
       ->createQuery('a') 
       ->select('substr(a.created_at,1,10) as date') 
       ->leftjoin('a.PictureTag pt ON a.id = pt.picture_id') 
       ->leftjoin('pt.Tag t ON t.id = pt.tag_id') 
       ->where('a.created_at <= ?', date('Y-m-d 23:59:59')) 
       ->orderBy('date DESC') 
       ->groupby('date') 
       ->limit(ITEMS_PER_PAGE) 
       ->offset(ITEMS_PER_PAGE * $this->page) 
       ->execute(); 

如果我删除了两个连接,它会更改查询,但结果集是相同的。 但是使用doctrine execute(),只产生一行。

有人对这里发生了什么有个想法吗?

PS:图片表有ID,标题,文件,created_at(格式 'Y-M-d H:I:S'),标签表ID,名称和PictureTag与id和两个外键的关系表。

PS 2:这里是产生的两个SQL查询(第一个加入无)

SELECT substr(l.created_at, 1, 10) AS l__0 FROM lupa_picture l WHERE (l.created_at <= '2010-03-19 23:59:59') GROUP BY l__0 ORDER BY l__0 DESC LIMIT 4 

SELECT substr(l.created_at, 1, 10) AS l__0 FROM lupa_picture l LEFT JOIN lupa_picture_tag l2 ON (l.id = l2.picture_id) LEFT JOIN lupa_tag l3 ON (l3.id = l2.tag_id) WHERE (l.created_at <= '2010-03-19 23:59:59') GROUP BY l__0 ORDER BY l__0 DESC LIMIT 4 

回答

0

那么,解决方案是...除substr()之外,它需要表的另一列。使用select(substr(),a.created_at)使其工作

1

我有这个星期类似的东西。 Doctrine生成的SQL(来自Symfony调试工具栏)在phpMyAdmin中运行良好,但在运行查询时失败,如同在您的问题中一样。尝试添加下面的到你的查询:

->setHydrationMode(Doctrine::HYDRATE_SCALAR) 

,看看它给你预期的结果。如果是这样,则使用图片主键作为集合中的索引取决于Doctrine_Collection。如果你有超过1个结果具有相同的索引,Doctrine将拒绝将它添加到集合中,所以你最终只能得到1个结果。我最终使用不同的表而不是我想要的来运行查询,这导致了一个独特的主键,然后我想要的结果出现了。

+0

现在它返回零行XD 我想我解决了它...除了substr(),它需要表的另一列。使用select(substr(),a.created_at)使其工作(现在) – Leprosy 2010-03-19 19:32:41

+0

确认...它正在工作...:P – Leprosy 2010-03-19 19:41:00

+1

遇到过一些我认为是由此问题导致并解决它的问题 - 现在我知道!钽 – benlumley 2010-03-20 00:27:35