0

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で上記の要件を達成する方法を教えてもらえますか?

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 に答える