Symfony 1.4 /Propel1.4を使用して自己参加する必要があります。私のtables/dbは大きすぎてここに置くことができませんが、私が直面している問題を再現するためのテーブルの例を以下に示します。
サンプルデータを含む次のサンプルテーブルを検討してください
Table Employee
----------------------------------------
|id | name | mid |
----------------------------------------
|1 | CEO |NULL |
|2 | CTO |1 |
|3 | CFO |1 |
|4 | PM1 |2 |
|5 | TL1 |4 |
----------------------------------------
ここで、最初の列は従業員、2番目は従業員名、3番目はマネージャーIDです。midは、同じテーブルの別の行へのリンクです。たとえば、CTO(2)はCEO(1)に報告するため、2行目の中央は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が発生しました。
ただし、自己結合は一般的なデータベース操作の1つであり、Propelがそれをサポートする必要があると確信しています。誰かがSymfony/Propel1.4で上記の要件を達成する方法を教えてもらえますか?