条令查询生成器select distinct抛出错误

w1jd8yoj  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(347)

这应该是直截了当的。我确实在so和其他地方找到了很多关于这个主题的帖子,但它只是抛出了一个错误:
[语义错误]第0行,第18列“来自app\entity\message的线程”附近:错误: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(); 
}

谢谢

66bbxpm5

66bbxpm51#

尝试这些解决方案之一,我认为您的问题是您没有在使用查询生成器的解决方案中指定“from”。也可以从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;
}

相关问题