Я не могу написать мои запросы доктрины на DQL - PullRequest
0 голосов
/ 11 апреля 2019

, будучи великим новичком Symfony и, следовательно, доктриной, у меня проблема с двумя запросами, которые мне нужно сделать.

У меня есть таблица User, которая содержит отношение ManyToMany с сущностью Packages. (Создание таблицы "packagesDDLUser")

В моей сущности пользователя у меня есть поле "пакеты".

Мои пользователи скачивают пакеты. Когда это происходит, загруженный пакет вставляется в базу данных в объекте «packagesDDLUser», например «user_id, package_id».

То, что я хочу сделать, это иметь возможность отображать на странице список пакетов, которые не являются частью пакетов, с которыми пользователь уже связан.

Обычно, когда пользователь загружает пакет, его бесполезно отображать в списке тех, которые можно загрузить.

У меня есть два запроса. Тот, который будет собирать пакеты, загруженные пользователем с параметром id пользователя. И еще один, который должен выбрать список пакетов, которые не принадлежат этому списку.

Итак, я:

public function getPackagesUser($id)
    {
        $queryBuilder = $this->createQueryBuilder("u")
        ->select("u.packages")
        ->where("u.id = :id")
        ->setParameter("id", $id);
        return $queryBuilder->getQuery()->getResult();

    }

Но у меня есть эта ошибка:

[Семантическая ошибка] строка 0, столбец 9 рядом с «пакетами ОТ»: ошибка: недействительный PathExpression. Должно быть StateFieldPathExpression.

И мой второй запрос:

public function getPackagesNotUser($packagesUser)
    {
        $qb = $this->createQueryBuilder('p');
        $queryBuilder= $qb->where($qb->expr()->notIn('p.id', array_column($packagesUser, 'id')));

        return $queryBuilder->getQuery()->getResult();
    }

Может ли кто-нибудь помочь мне? Я не очень разбираюсь в Доктрине, она довольно новая для меня

Спасибо

EDIT:

Хорошо, теперь у меня есть: controller.php

 $user = $this->getUser();
 $packagesUser = $user->getPackages()->toArray();
$packagesView = $this->getDoctrine()->getRepository('PagesBundle:Paquet')->getPackagesNotUser($packagesUser);

Репозиторий:

public function getPackagesNotUser($packagesUser)
    {
        $qb = $this->createQueryBuilder('p');
        $queryBuilder= $qb->where($qb->expr()->notIn('p.id', array_column($packagesUser, 'id')));

        return $queryBuilder->getQuery()->getResult();
    }

Но у меня есть эта ошибка

[Синтаксическая ошибка], строка 0, столбец 65: ошибка: ожидаемый литерал, получен ')'

Об этом:

return $ queryBuilder-> getQuery () -> getResult ();

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Во-первых, вы не можете напрямую выбирать пакеты, подобные этой [в вашей первой функции]. Вы должны присоединиться. Например, как:

public function getPackagesUser($id)
{
   $queryBuilder = $this->createQueryBuilder("u")
        ->join("u.packages", "packages")
        ->where("u.id = :id")
        ->setParameter("id", $id);

   return $queryBuilder->getQuery()->getResult();

}

Во-вторых, ваша вторая функция звучит так, как будто вы должны передать объект пользователя в качестве параметров. Что-то вроде:

public function getPackagesNotUser(User $user)
{
    $packagesUser = $user->getPackages()->toArray();
    $qb = $this->createQueryBuilder('p');
    $queryBuilder= $qb->where($qb->expr()->notIn('p.id', array_column($packagesUser, 'id')));

    return $queryBuilder->getQuery()->getResult();
}

Итак, вам не нужна первая функция.

0 голосов
/ 11 апреля 2019

Для первого вам нужно присоединиться к u.packages Было бы что-то вроде этого

<?php

public function getPackagesUser($id)
    {
        $queryBuilder = $this->createQueryBuilder("u")
        ->select("p")
        ->join("u.packages", "p")
        ->where("u.id = :id")
        ->setParameter("id", $id);
        return $queryBuilder->getQuery()->getResult();

    }

Для второго я никогда не использовал notIn, но я нашел что-то в переполнении стека, которое могло быпомочь вам.

Как я могу выбрать каждую строку, где столбец отсутствует (массив значений) с Doctrine?

Массив не в массиве для запроса доктрины

...