Примечание: Возможно, вы захотите перейти к нижней части, чтобы прочитать актуальный вопрос, прежде чем читать все эти дополнительные материалы.
Я работаю над реализацией ACL для CakePHP. Главным образом потому, что я пытаюсь отделить его от AuthComponeny, чтобы я мог использовать Authsome для своих проектов. У меня есть теория реализации, но я наткнулся на небольшой камень преткновения.
Очевидно, я хочу свести к минимуму количество запросов к базе данных. Поэтому я спрашиваю здесь о том, что это возможно (я серьезно сомневаюсь, что это так).
Предполагая такую структуру таблицы:
id - int(10), auto_increment, primary_key, not null
parent_id - int(10), null
model - varchar(255), utf8_bin, null
foreign_key - int(10), null
alias - varchar(255), utf8_bin, null,
lft - int(10), null
rght - int(10), null
И несколько записей для проверки (контроллеры - это корневой узел, и я мог бы неправильно указать значения lft и rght):
1, null, null, null, controllers, 1, 14
2, 1, null, null, one_test_controllers, 2, 7
3, 2, null, null, one_action, 3, 4
4, 2, null, null, two_action, 5, 6
5, 1, null, null, two_test_controllers, 8, 13
6, 5, null, null, one_action, 9, 10
7, 5, null, null two_action, 11, 12
И два тестовых пути:
$test1 = '/controllers/one_test_controller/two_action';
$test2 = '/controllers/two_test_controller/two_action';
Давать эти результаты, возвращая массив идентификаторов от наиболее релевантных до наименее релевантных:
// Result 1
array(
0 => 4,
1 => 2,
2 => 1
)
// Result 2
array(
0 => 7,
1 => 5,
2 => 1
)
То, что я сейчас делаю, это взорвать () путь к массиву и (используя $ test1 для этого примера) сначала найти все записи, которые соответствуют псевдониму "two_action"; затем просматривая результаты и находя все записи, которые соответствуют родительским идентификаторам последнего результата и имеют псевдоним "one_test_controller". Затем повторяйте, пока parent_id = 0.
Это работает, но очевидно, что несколько рекурсивных SQL-запросов не идеальны, есть ли магический SQL-запрос, который может помочь мне в этом? Или я прав, полагая, что это лучшее, что он может получить?