Добрый день.
Нужна помощь в составлении запроса. Есть таблица товаров и таблица категорий с двумя уровнями. Прилагаю вырезки YML, по которым сгенерированы сущности в Symfony.
ItemmanyToOne:
category:
targetEntity: Category
cascade: { }
mappedBy: null
inversedBy: item
joinColumns:
category:
referencedColumnName: id
orphanRemoval: false
В свою очередь
Category
oneToMany:
childrenCategory:
targetEntity: Category
mappedBy: parentCategory
item:
targetEntity: Item
mappedBy: category
manyToOne:
parentCategory:
targetEntity: Category
cascade: { }
mappedBy: null
inversedBy: childrenCategory
joinColumns:
parent_category:
referencedColumnName: id
orphanRemoval: false
Чтобы найти товары по конечной категории, тут все просто. Они есть в самой таблице item.
$query = $query->where('i.category = :category')
->setParameter('category', $categoryId);
Но я хочу найти товары по родительской категории. В теории нам надо сделать join на category.id на item.category и потом добавить условие с моим parentId.
Набросал так:
$query = $query->join('i.category', 'c', 'WITH', 'i.id = c.parentCategory')
->where('c.parentCategory = :mainCategory')
->setParameter('mainCategory', $mainCategoryId);
В итоге ничего так как расшифровке запроса мы видим:
SELECT DISTINCT c0_.id AS id0, c0_.id AS id1 FROM crbr_item c0_ INNER JOIN crbr_category c1_ ON c0_.category = c1_.id AND (c0_.id = c1_.parent_category) WHERE c1_.parent_category = '20
Тут явно лишняя строка
AND (c0_.id = c1_.parent_category)
Как от нее избавиться? Не хочется использовать чистый SQL, а все же DQL, тем более, что есть связи, включая выборку дочерних, и можно сделать по-уму. Спасибо!