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