В Yii2 таких функций нет. CakePHP также выполняет несколько запросов в фоновом режиме и просто переносит их в многопоточный вызов. Основное преимущество скорости, которое вы могли бы получить, если бы вы могли выполнить только один запрос.
Есть два способа для достижения этой цели:
- Твоего пути ... забирающие все и объединить его в вашем коде
- NestedSet рисунок как упомянут в комментариях выше
NestedSet
Для Yii2 у нас очень хорошее расширение, реализующее узор вложенного набора. Вы можете найти его здесь:
https://github.com/creocoder/yii2-nested-sets
Плюсы и минусы
Преимуществом является то, - очевидно, - что вы можете получить все, что с помощью одного запроса. Вы даже можете сохранить несколько деревьев в одной таблице.
Основным недостатком является сортировка по столбцам при сохранении древовидной структуры. Вложенный набор организован с двумя атрибутами: слева и справа. Это означает, что все данные сортируются в соответствии с этими двумя атрибутами. Чтобы получить древовидную структуру, отсортированную, например, по имени, вам все равно придется реализовать функциональность с кодовым разделением, чтобы изменить полученный набор данных после запроса. Чистейший способ сортировки данных при сохранении ... смысле вставить новую запись в соответствии с его местом в желаемых сортировках
Википедия имеет очень хорошую explenation вложенного набора: https://en.wikipedia.org/wiki/Nested_set_model
Эта иллюстрация показывает как это работает:
Пример: «слабина» и «куртка» являются детьми «костюмов», как оба их левых и правых атрибуты между левым (3) и правым (8) значением ' костюмы. Если вы хотите добавить ребенка в «куртки», вы будете вводить его между 6 и 7 ... поэтому увеличивая все значения выше или равные 7 на два. Вновь введенный ребенок «куртки» затем получит левое значение 7 и правое значение 8.
Как вы можете видеть, теперь вы можете легко получить целое (под) дерево, просто фильтруя левый и правый атрибуты. Я ж вы хотели, чтобы все от вниз «костюмы» Ваш запрос будет выглядеть следующим образом:
SELECT * FROM mytable WHERE left >= 3 AND right <= 8 ORDER BY left ASC
окончательный ответ на ваш вопрос
Если основное внимание комфорт
No. Таких функциональных возможностей нет. Если вам по-прежнему требуется регулярное дерево в вашем db и просто не хотите заботиться о слиянии данных, вам нужно будет написать эквивалентную функциональность методам CakePHP. Это должно быть довольно легко, и я думаю, что в этом будет много людей.
Если вашей главной задачей является скорость
Используйте вложенное множество. Это один чертовски простой образец и мощный!
Для этого нет функции, но вы можете использовать [вложенные списки] (https://github.com/creocoder/yii2-nested-sets). – Beowulfenator
Yii's AR не может заполнять иерархические данные за один раз. Вы можете построить структуру дерева, подобную массиву, используя ссылки, чтобы избежать рекурсии. Если вас интересует, что я могу опубликовать пример. – nineinchnick
@nineinchnick да, пожалуйста, я хотел бы посмотреть пример. – ankitr