2

使用 symfony2 但它更多只是 mysql 问题......

我认为我有很好的表模式(只是重要的字段)(代码是不言自明的):

用户 (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);

但结果是 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

效果很好,但是我如何实现其他评论和(用户->评论作者)选择那里?...

4

1 回答 1

1

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

您需要使用此处描述的分页器:http: //docs.doctrine-project.org/en/latest/tutorials/pagination.html

如果它在您的 Doctrine 版本中不可用(您是 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; }
}

编辑:将“继续”更改为“休息”;无论如何,这都是蹩脚的代码——不要使用它,我只是在说明一个替代方案。

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

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

编辑:类似的问题:使用 fetch-joined 集合限制学说查询?

于 2013-03-29T00:27:46.050 回答