Выбор построителя запросов Symfony по нескольким объединенным идентификаторам (ManyToMany) - PullRequest
0 голосов
/ 26 декабря 2018

Неверный запрос:

$qb = $this->createQueryBuilder('product')
    ->join('product.specifications', 'specification')
    ->andWhere("specification.id = :specificationId_1") // this
    ->andWhere("specification.id = :specificationId_2") // and this
    ->setParameter("specificationId_1", 1)
    ->setParameter("specificationId_2", 2)
    ->getQuery()
    ->getResult()
;

Таблицы (product относится к specifications по ManyToMany):

product:
  id  name
  1   Product1
  2   Product2
  3   Product3

specifcation:
  id   name
  1    Specification1
  2    Specification2
  3    Specification3

product_specification:
  product_id   specification_id
  1            1
  1            2
  1            3
  2            1
  2            2
  3            3

Ожидаемый результат:
Продукты с идентификаторами 1и 2.


Что нужно:
Нужно получить товары по ВСЕМ specification_id записям.


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


IN оператор не помогает, потому что результат выбора по спецификациям 1, 2 и 3 должен быть пустым, потому что у нас нет продуктов, которые имеют ВСЕ три отношения спецификаций.


PS Я понимаю, почему это не работает, но не понимаю, как это сделать.И не могу найти что-то вроде в stackoverflow.

Спасибо!

1 Ответ

0 голосов
/ 26 декабря 2018

Решение:

$qb = $this->createQueryBuilder("product")
    ->join("product.specifications", "specification_1")
    ->join("product.specifications", "specification_2")
    ->andWhere("specification_1.id = :specificationId_1")
    ->andWhere("specification_2.id = :specificationId_2")
    ->setParameter("specificationId_1", 1)
    ->setParameter("specificationId_2", 2)
    ->getQuery()
    ->getResult()
;

Для каждого where необходимо снова join таблица с новым alias.

...