@Qixing

Как написать запрос в doctrine?

Работаю в Symfony2.
У меня есть две сущности
  • Category {id,name}
  • Item{id,category,name,isActive}


Генерирую меню со вложенными item. наподобие
Машины (category.name)
- машина1 (item.name)
- машина2 (item.name)
Самолет (category.name)
- самолет1 (item.name)
- самолет2 (item.name)

Генерация в twig
{% for category in categories %}
{{category.name}}
{% for item in category.items %}
- {{ item.name }}
{% endfor %}
{% endfor %}

Если запросить найти все, то проблем нет.
Но мне нужно
1) Вывести все категории
2) Вывести вложенные item которые isActive = 1

Пробовал так
class CategoryRepository extends EntityRepository
{
    public function findAll()
    {
        return $this->createQueryBuilder('c')
            ->innerJoin('c.items', 'i')
            ->where('i.isActive = 1')
            ->orderBy('c.position', 'ASC')
            ->getQuery()->getResult();
    }

}

1) Выводить категории не все, только те которые имеют items
2) Items выводятся все равно все, даже isActive = 0

Буду благодарен за решение + ссылки по теме.
  • Вопрос задан
  • 1328 просмотров
Решения вопроса 2
0neS
@0neS
Я бы двумя запросами это сделал: первым вытаскиваем ID всех категорий, вторым вытаскиваем все категории с их итемами.

Пример на чистом SQL:
SELECT DISTINCT(category_id)
FROM items
WHERE is_active = 1;

SELECT *
FROM categories c
INNER JOIN items i
ON (i.category_id = c.id)
WHERE c.id IN (categoriesIDS)
ORDER BY c.position ASC;
Ответ написан
Комментировать
lexxpavlov
@lexxpavlov
Программист, преподаватель
> Items выводятся все равно все, даже isActive = 0
нужно ставить не 1, а true:
->where('i.isActive = true')
Я не подскажу, как сделать выборку только категорий, имеющих вложенные элементы, но вы легко сможете не выводить их в шаблоне:
{% for category in categories if category.items is not null %}
{{category.name}}
{% for item in category.items %}
- {{ item.name }}
{% endfor %}
{% endfor %}


Если у вас есть сложные запросы, то рассмотрите возможность использования NativeQuery:
doctrine-orm.readthedocs.org/en/latest/reference/n... (на русском odiszapc.ru/doctrine/native-sql)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы