У меня есть 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 и проверяя, содержит ли связанная сущность продукта конкретный идентификатор выпуска, но это кажется крайне неэффективным, если существует большой набор данных для перебора.
Я знаю, что должен использовать соединение, но я застрял в мысли, что мне нужно перебирать продукты в списках продуктов. Списки продуктов могут содержать более одного продукта, но мне нужны только те, в которых есть только один продукт, и проверьте, есть ли у них версия с определенным идентификатором.
Попробуйте это для извлечь весь список продуктов для указанной версии, имеющей только одно издание:
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
Надеюсь это поможет
Других решений пока нет …