DQL для выбора строки в отношении x-to-x

У меня есть 3 разных объекта, которые сопоставлены друг с другом. Чтобы привести очень упрощенный пример.

Список продуктов:

class ProductList
{
/**
* @ORM\OneToMany(targetEntity="Product", mappedBy="productlist") */
protected $products;
}

Товар:

class Product
{
/**
* @ORM\ManyToOne(targetEntity="Edition")
* @ORM\JoinColumn(name="edition_id", referencedColumnName="id")
*/
protected $edition;

/**
* @ORM\ManyToOne(targetEntity="ProductList")
* @ORM\JoinColumn(name="productlist_id", referencedColumnName="id")
*/
protected $productlist;
}

Издание

class Edition
{
protected $id;
}

Как я могу получить все списки продуктов в моем productListRepository, которые содержат только 1 продукт с определенным идентификатором выпуска, используя DQL?

Я знаю, как сделать это «ленивым» способом, извлекая все элементы из productList и проверяя, содержит ли связанная сущность продукта конкретный идентификатор выпуска, но это кажется крайне неэффективным, если существует большой набор данных для перебора.

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

0

Решение

Попробуйте это для извлечь весь список продуктов для указанной версии, имеющей только одно издание:

SELECT pl
FROM ProductList pl
-- LEFT JOIN pl.products p
LEFT JOIN p.edition e
WHERE (sum (p1) from Product p1 where  p1.productlist = pl.id) = 1

Надеюсь это поможет

0

Другие решения

Других решений пока нет …