Построитель запросов Doctrine ManyToMany с таблицей соединений - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь построить что-то вроде этого запроса с помощью построителя запроса доктрины:

SELECT m.id
FROM product p, model m
  INNER JOIN product_model pm ON (m.id = pm.model_id)
WHERE p.id = pm.product_id AND m.serial = ? AND p.id = ?

Таблица 'product_model' является таблицей JoinTable в однонаправленных отношениях ManyToMany. Я использую код ниже:

$queryBuilder = $this->entityManager->createQueryBuilder();
        $queryBuilder
            ->select('m.id')
            ->from(Model::class, 'm')
            ->join(Product::class, 'p', Join::ON, '1 = 1')
            ->where('m.serial.serial = :serial')
            ->andWhere('p.productId.id = :productId')
            ->setParameters(
                [
                    'serial'    => (string)$serial,
                    'productId' => $productId->value(),
                ]
            );
        $query = $queryBuilder->getQuery();
        $results = $query->getOneOrNullResult();

Но когда я пытаюсь сбросить sql этого запроса, я получаю:

SELECT m0_.id AS id_0 FROM model m0_ INNER JOIN product p1_ ON (1 = 1) WHERE m0_.serial = ? AND p1_.id = ?

И результат этого запроса не тот, который я ожидал

1 Ответ

0 голосов
/ 30 апреля 2018

Я нашел решение. Мне нужен другой класс сущности для product_model tabel с составным ключом и небольшими изменениями в запросе:

$queryBuilder
            ->select('m.id')
            ->from(Model::class, 'm')
            ->join(ProductModel::class, 'pm', Join::WITH, $queryBuilder->expr()->eq('m.id', 'pm.modelId'))
            ->where('m.serial.serial = :serial')
            ->andWhere('pm.productId = :productId')
            ->setParameters(
                [
                    'serial'    => (string)$serial,
                    'productId' => $productId->value(),
                ]
            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...