0

我需要使用 Symfony 1.4/Propel 1.4 进行自我加入。我的表/数据库太大而无法放在这里,但下面给出了一个示例表来复制我面临的问题。

考虑以下带有示例数据的示例表

Table Employee
----------------------------------------
|id    | name                    | mid |
----------------------------------------
|1     | CEO                     |NULL |
|2     | CTO                     |1    |
|3     | CFO                     |1    |
|4     | PM1                     |2    |
|5     | TL1                     |4    |
----------------------------------------

这里第一列是员工,第二列是员工姓名,第三列是经理 ID。mid 链接到同一张表中的另一行。例如,CTO(2) 向 CEO(1) 汇报,所以第二行中间是 1。

我需要以下输出:

---------------------
|ename    | manager |
---------------------
|CTO      | CEO     |
|CFO      | CEO     |
|PM1      | CTO     |
|TL1      | PM1     |
---------------------

SQL 查询将是:

SELECT e.name,m.name
FROM employee e, employee m
WHERE e.mid=m.id
AND e.mid NOT NULL;

我的问题是,如何在 Symfony/Propel 1.4 中编写相同的查询?我尝试关注

$c = new Criteria();
$c->clearSelectColumns();
$c->addSelectColumn(EmployeePeer::NAME.' as ename');
$c->addSelectColumn(EmployeePeer::NAME.' as manager');
$c->setPrimaryTableName(EmployeePeer::TABLE_NAME);
$c->addJoin(EmployeePeer::MID, EmployeePeer::ID, Criteria::INNER_JOIN);
$c->add(EmployeePeer::MID, NULL, Criteria::EQUAL);

即使我知道这个查询没有任何意义,并且按照我的预期,我得到了 PropelException。

但是自连接是常见的数据库操作之一,我相信 Propel 必须支持它。有人可以告诉如何在 Symfony/Propel 1.4 中实现上述要求

4

3 回答 3

3

好吧,我从来没有尝试过,所以不确定这是否对您有帮助,但没有其他答案,所以addAlias如果您遇到困难,您可以尝试/进一步搜索方法。

$notifCrit->addAlias("A", ThreadsPeer::TABLE_NAME);
$notifCrit->add("A.father_id", ThreadsPeer::FATHER_ID."=A.father_id", Criteria::CUSTOM);

摘自旧 symfony 论坛的最后评论

不确定,但 Propel 1.4 可能不支持使用内置方法进行自连接,因为它需要设置别名。因此,您需要如上例所示的自定义查询。

于 2012-09-17T10:26:23.540 回答
3

根据这个SQLFiddle,您要执行的 SQL 是:

SELECT e.name as ename, m.name as manager
FROM employee e
LEFT JOIN employee m ON e.mid = m.id WHERE e.mid IS NOT NULL;

就像YouthPark,我认为addAlias是解决方案,我会做这样的事情:

$c = new Criteria();
$c->clearSelectColumns();
$c->addSelectColumn(EmployeePeer::NAME.' as ename');
$c->addSelectColumn(EmployeePeer::NAME.' as manager');

$c->addAlias('c2', EmployeePeer::TABLE_NAME);

$c->addJoin(EmployeePeer::ID, EmployeePeer::alias('c2', EmployeePeer::MID), Criteria::LEFT_JOIN);

$c->add(EmployeePeer::MID, Criteria::ISNOTNULL);

顺便说一句,我不确定这addSelectColumn部分。

于 2012-09-17T14:41:03.567 回答
0
$c = new Criteria();
$c->addJoin(ArticlePeer::AUTHOR_ID, AuthorPeer::ID);
$c->add(AuthorPeer::NAME, 'John Doe');
$articles = ArticlePeer::doSelect($c);
于 2016-11-23T04:43:40.697 回答