2013-03-29 163 views
2

使用Symfony2的,但它更多的只是MySQL的问题...Symfony2的多个左连接,内连接

我想我有很好的表架构(只是重要的字段)(代码是自我解释):

用户(ID) 状态(ID) 喜欢(ID,USER_ID,STATUS_ID) 评论(ID,USER_ID,STATUS_ID)

我正在大选择。

试图这样:

$qb=$this->createQueryBuilder('s') 
      ->addSelect('u') 
      ->addSelect('u2') 
      ->addSelect('u3') 
      ->addSelect('l') 
      ->addSelect('c') 
      ->addSelect('s2') 
      ->where('s.user = :user') 
      ->setParameter('user', $user) 
      ->innerJoin('s.user', 'u') 
      ->leftJoin('s.likes', 'l') 
      ->leftJoin('l.user', 'u2') 
      ->leftJoin('s.comments', 'c') 
      ->leftJoin('c.user', 'u3') 
      ->leftJoin('c.status', 's2') 
      ->orderBy('s.time', 'DESC') 
      ->setMaxResults(15); 

但结果是相同的第十五状态...错了。

它运作良好时,我是只选择状态...喜欢...状态和

就像用户(喜好和状态的作者):

SELECT * FROM statuses s0_ 
INNER JOIN users t1_ ON s0_.user_id = t1_.id 
LEFT JOIN status_likes s2_ ON s0_.id = s2_.status_id 
INNER JOIN users t3_ ON s2_.user_id = t3_.id 

WHERE s0_.user_id = 25 ORDER BY s0_.time DESC LIMIT 15 

,工作得非常好,但如何我可以执行另一个评论和(用户 - >评论作者)选择吗?...

回答

1

您不能以您尝试的方式在连接的查询上设置最大结果。

您需要使用分页程序如下所述: http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

如果它不是在您所在主义的版本(你是预2.2),然后你可以使用这里的分页程序: https://github.com/beberlei/DoctrineExtensions

另一个选项是不在查询中执行连接 - 只是简单地允许连接的数据自动获取。因此,遍历用户并遍历对象图来获取所需的信息。这显然会发出更多的查询:

$users = $userRepository->findById($user); 
$i = 0; 
for ($users as $user){ 
    $likes = $user->getLikes(); 
    $comments = $user->getComments(); 
    $i++; 
    if ($i == 15) { break; } 
} 

edit:将'continue'改为'break';无论如何,这是糟糕的代码 - 不要使用它,我只是在说明一个替代方案。

最后,你可以使用本机查询来执行此:

http://docs.doctrine-project.org/en/2.1/reference/native-sql.html

编辑:类似的问题:Limiting a doctrine query with a fetch-joined collection?

+0

第一次听到有关分页...我2.2.3我想..我需要做的是尽可能减少查询posiblle和最好的表现......我有我的查询在自己的存储库,当我看着你的分页链接...我很困惑什么正在发生..(2AM)你能否给我看看我的情况更友好的例子,很少有解释,或者这将是太多的工作?顺便说一句:当我从我的查询限制语句中删除,我得到所有状态......但每个状态返回阿布30次?似乎不是很好的wr ... ......或者? – EnchanterIO

+0

您是否尝试了分页文档顶部的代码?我怀疑你可能会尝试使用像SQL这样的DQL,这不是一回事。您可以通过像这样从查询生成器中提取查询来获取相同的对象$ query。 $ QB-> getQuery();根据示例将它们馈入Paginator,看看是否有帮助。 – calumbrodie

+0

thx!嗯分页似乎工作。但是,当我尝试计数($ paginator)我看到那里:50。这是什么意思? +当你在phpmyadmin中尝试SQL时,你对这么多相同的返回行有什么意见? (来自评论的问题)。以信息状态身份证...现在我访问$状态 - > getId()和没有$状态['身份证'](我有getArrayResult在查询之前)...但多数民众赞成似乎工作,我只是不确定现在的表演?从13ms我有260ms!第一个查询选择不同的状态标识。其次是从这些ID中选择所有数据。 HM ??? – EnchanterIO