原则查询生成器SELECT DISTINCT引发错误

时间:2018-10-02 07:25:14

标签: php mysql doctrine-orm symfony4

这应该很简单。我确实在SO和其他地方找到了有关该主题的许多文章,但这只会引发错误:

  

[语义错误]第0行,第18列靠近“来自应用程序\实体\消息的线程”:错误:无效的PathExpression。必须是StateFieldPathExpression。

这是用于在消息模块上选择不同的线程。我尝试的查询是:

public function getThreads() {
    return $this->createQueryBuilder('m')
        ->select('DISTINCT m.thread')
        ->where('m.thread IS NOT NULL')
        ->orderBy('m.thread', 'DESC')
        ->setMaxResults(10)
        ->getQuery()
        ->getResult();

消息实体:

class Message
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Ad", inversedBy="messages")
 * @ORM\JoinColumn(nullable=true)
 */
private $ad;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Message")
 */
private $thread;
.....

为了公平起见,我确实设法使其与DQL一起使用,但是,您知道,我似乎无法不使用查询生成器来解决它。

顺便说一下,这里是DQL:

    public function getThreads() {
    $query = $this->em->createQuery(
        'SELECT DISTINCT(m.thread) FROM App:Message m 
        WHERE m.thread IS NOT NULL 
        ORDER BY m.thread DESC
        LIMIT 10 ');
    return $query->getResult(); 
}

谢谢

1 个答案:

答案 0 :(得分:0)

尝试这些解决方案之一,我认为您的问题是您没有使用查询生成器在解决方案中指定“来源”。您也可以从createQueryBuilder()函数中删除“ m”,此函数不接收任何参数。我希望这些解决方案之一对您有用。

解决方案1 ​​

public function getThreads(){
    return $this->em->createQueryBuilder()
                    ->select('DISTINCT m.thread')
                    ->from('App\Entity\Message', 'm')
                    ->where('m.thread IS NOT NULL')
                    ->orderBy('m.thread', 'DESC')
                    ->setMaxResults(10)
                    ->getQuery()
                    ->getResult();
}

解决方案2

public function getThreads(){
    return $this->em->createQueryBuilder()
                    ->select('m.thread')->distinct()
                    ->from('App\Entity\Message', 'm')
                    ->where('m.thread IS NOT NULL')
                    ->orderBy('m.thread', 'DESC')
                    ->setMaxResults(10)
                    ->getQuery()
                    ->getResult();
}

解决方案3

public function getThreads(){
    $queryBuilder = $this->em->createQueryBuilder();
    $queryBuilder->select('m.thread')->distinct()
                 ->from('App\Entity\Message', 'm')
                 ->where($queryBuilder->expr()->isNotNull('m.thread'))
                 ->orderBy('m.thread', 'DESC')
                 ->setMaxResults(10);

    $query = $queryBuilder->getQuery();
    $result = $query->getResult();
    return $result;
}