У меня есть таблица категорий:
id | name | parent_id
1 | Camaro | 0
2 | Chevelle | 0
3 | Sale - Camaro Parts | 1
4 | Bestselling Parts | 1
Мой первый запрос выглядит так:
'SELECT
*
FROM
`categories`
WHERE
parent_id = :parent_id';
И после того, как я получаю набор результатов, я делаю подзапрос, чтобы проверить, есть ли в строке дочерние элементы:
foreach($result as $r) {
$r->hasChild = count(ORM::forTable('categories')->where('parent_id', $r->id)->findArray());
$data[] = $r;
}
Есть ли способ избежать множественного подключения к БД в цикле foreach и получить данные в первом запросе?
Спасибо!
Это не страшно, если вам нужно только количество детей ниже выбранных строк. Если вам нужна вся иерархия, вам нужно использовать более качественную RDMS.
Основной частью решения здесь является самостоятельное соединение за одной таблицей. Тогда мы можем использовать count()
агрегатная функция, чтобы увидеть, сколько детей прикреплено к каждому элементу.
select
categories.id
, categories.name
, categories.parent_id
, count(chld.id)
from
categories
left join categories chld
on categories.id = chld.parent_id
where
parent_id = :parent_id
group by
categories.id
, categories.name
, categories.parent_id
Вы можете сделать самостоятельное присоединение к таблице по parent_id и id. В зависимости от того, хотите ли вы категории с дочерним элементом или нет, вы можете выполнить левое или внутреннее соединение. Вид подобного вопроса упоминается здесь —
Mysql Self Join, чтобы найти отношения родитель-потомок в той же таблице