Doctrine 2.5中的CTE递归查询

时间:2017-03-27 14:04:25

标签: sql doctrine-orm common-table-expression recursive-query

我有一个表用户有2个关键的referrer列和referral_code,它是树结构的简单实现。目标是根据推荐他们使用此应用程序的人来获取用户的踪迹。

IsSelected

我需要一个递归查询,其中基于触发器,例如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 活动的报告可以在引用者上产生最大深度为4的跟踪字符串。 我想要的输出字符串是User C,这意味着根据用户活动跟踪引荐。树可以在无限深度上生长,因此,跟踪004-003-002-001的痕迹可以产生在引用代码上连接的树上的4个人的堆栈跟踪。 我使用User QA作为doctrine 2.5。 约束

  1. 必须提及用户使用系统
  2. 用户可以引用多个用户来使用系统

2 个答案:

答案 0 :(得分:0)

Somnambulist.tech构建了一个通用表表达式(CTE)Doctrine表达式构建器,该构建器是用于对将位于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();

答案 1 :(得分:-1)

如果4的深度是固定的,那么你不需要递归,只需要自己加入4次。 如果您真的想使用递归,可以为dbms编写自己的DQL函数。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html