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

0

У меня есть 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 может содержать более одного продукта, но мне нужны только те, у которых есть только один продукт, и проверьте, есть ли у них издание с конкретным идентификатором.

Теги:
database
dql
doctrine2

1 ответ

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
    Спасибо, это работает! Есть ли способ включить оператор в запрос, чтобы выбирались только списки товаров, содержащие один элемент. Или эта логика должна быть сделана вне запроса?
  • 0
    ах! должен совпадать только ProductList с одной и только одной версией?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню