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. Пользователь должен быть направлен на использование системы
  2. Пользователь может ссылаться на несколько пользователей, чтобы использовать систему

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

Другие вопросы по тегам