CTE Рекурсивные Запросы в Доктрине 2.5
У меня есть таблица Users, которая имеет 2 ключевых столбца referrer и referral_code, который представляет собой простую реализацию древовидной структуры. Цель состоит в том, чтобы получить список пользователей на основе того, кто направил их использовать это приложение.
NAME | Referrer | Referral_Code
----------------------------------------------
Super User | 000 | 001
User A | 001 | 002
User B | 002 | 003
User C | 003 | 004
User n | 00n | 00n-1
Мне нужен рекурсивный запрос, основанный на триггере, например отчет User C
Действия могут дать строку трассировки на реферерах на глубину максимум 4. Моя желаемая выходная строка 004-003-002-001
что подразумевает отслеживание рефералов в зависимости от активности пользователей. Дерево может расти бесконечно глубоко, поэтому след User QA
может дать трассировку стека из 4 человек вверх по дереву, соединенному по реферальным кодам. я использую doctrine 2.5
как ORM
, Ограничения
- Пользователь должен быть направлен на использование системы
- Пользователь может ссылаться на несколько пользователей, чтобы использовать систему
1 ответ
Somnambulist.tech построил построитель выражений Doctrine с общим табличным выражением (CTE), который является оболочкой для псевдонимов предложений, которые будут находиться внутри предложения WITH.
https://github.com/somnambulist-tech/cte-builder
Простой пример:
$eb = new ExpressionBuilder($connection);
$eb->createExpression('tacos');
$eb->tacos->select('id', 'type')->from('tacos'); // or $eb->get('tacos');
$eb->execute();
Если глубина 4 фиксирована, вам не нужна рекурсия, просто самостоятельное соединение 4 раза. Если вы действительно хотите использовать рекурсию, вы можете написать свою собственную функцию DQL для ваших dbms. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html