Построитель запросов доктрины SELECT DISTINCT выдает ошибку - PullRequest
0 голосов
/ 02 октября 2018

Это должно быть прямо вперед.Я нашел несколько сообщений в SO и других местах по этой теме, но он просто выдает ошибку:

[Семантическая ошибка] строка 0, столбец 18 рядом с «поток FROM App \ Entity \ Message»: Ошибка: неверное выражение пути.Должно быть 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 голосов
/ 02 октября 2018

Попробуйте одно из этих решений, я думаю, что ваша проблема в том, что вы не указали 'from' в решении, используя построитель запросов.Также вы можете удалить 'm' из функции createQueryBuilder (), эта функция не получает никаких параметров.Я надеюсь, что одно из этих решений подойдет вам.

Решение 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;
}
...