如何使用Doctrine 2按特定的一个到多个字段的值排序

时间:2014-05-14 13:46:21

标签: php doctrine-orm doctrine-query

我有一个User,一个Question和一个Answer实体。

  • 每个User都有n Answers
  • 每个Answer都有
    • 一个独特的aid
    • question字段,其中包含Question已回答的ID。
    • 用户提供的实际答案字符串,称为answer
  • 每个Question都有一个唯一的qid

我想根据他们对特定问题的回答选择所有Users。那是我走了多远:

$qid = 123; // The id of the question to order the users by.
$orderByDir = 'ASC';

$qb->select('u')
   ->from('EventManager_Entity_User', 'u')
   ->leftJoin('u.answers', 'a', \Doctrine\ORM\Query\Expr\Join::WITH, 'a.question = ' . $qid)
   ->orderBy('a.answer', $orderByDir);

$users = $qb->getQuery()->execute();

但结果没有订购:/

2 个答案:

答案 0 :(得分:1)

我想问你为什么不提及你的YAML中的关系或你描述列的任何其他方式?你的表,User-Answers得到1对多的关系和问答 - 得到1对多的关系。如果您使用YAML,注释等提及关系,则无需在哪个列上提及左连接。我认为在订购时会引起问题。因为你没有特别提到这种关系。如果您已正确提及关系(尝试运行php app / console doctrine:schema:valudate),您可以将查询改为此,

$qb->select('u')
   ->from('EventManager_Entity_User', 'u')
   ->leftJoin('u.answers','a')
   ->leftJoin('a.question','q')
   ->orderBy('a.answer', $orderByDir);

然后选择特定问题,在你的情况下,$ qid,你可以这样做,

$qb->select('u')
       ->from('EventManager_Entity_User', 'u')
       ->leftJoin('u.answers','a')
       ->leftJoin('a.question','q')
       ->where('q.id = :id')
       ->setParameter('id',$qid)
       ->orderBy('a.answer', $orderByDir);

如果你正确地提到你的关系并像这样写你的DQ​​L,我相信你会得到正确的结果。希望这会有所帮助。

干杯!

答案 1 :(得分:0)

我不能肯定这是正确的,但你的查询看起来不太正确。 特别是你加入Answers给用户的方式。对我而言,即使可能存在于您的架构中,它们之间似乎没有外键关系。

试试这个,它可能对您的架构不正确,但您应该能够理解正在发生的事情。假设连接是问题,那么排序应该有效。

use Doctrine\Common\Collections\Criteria;

$qb
    ->select('u')
    ->from('EventManager_Entity_User', 'u')
    ->join('u.answers', 'a')
    ->join('a.question', 'q')

    ->where('q.id = :question_id')
    ->setParameter('question_id', $qid)

    ->orderBy('a.answer', Criteria::ASC)
;

我将其更改为内部联接,没有它,一些没有链接到答案的用户可能会像其他人一样订购。