1

私は PropelBundle で Symfony2 を使用しており、次のスキーマがあるとしましょう:

<table name="person">
  <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
  <column name="name" type="VARCHAR" size="100" required="true"/>
</table>
<table name="person_parent">
  <column name="person_id" type="INTEGER" primaryKey="true" required="true"/>
  <column name="parent_id" type="INTEGER" primaryKey="true" required="true"/>
</table>

親が多くの子「人」を持つことができるように、人は多くの「親」を持つことができると考えてください。「person_parent」テーブルの両方の列は、「person」テーブルへの外部キーです。テーブル「book_author」のスキーマで isCrossRef="true" を設定できる Book/Author のような関係とは異なり、Propel は直接 author クラスから book オブジェクトを取得/設定/追加するためのメソッドを生成できます。 isCrossRef="true" を設定することはできないため、"Person" オブジェクトから直接親の Person オブジェクトを取得/設定/追加することはできません。つまり、次のことはできません。

$person = new Person();
$person->setPersonParents($personCollection);

特定の人のすべての親「Person」オブジェクトを設定するメソッド「setPersonParents()」は使用できません。ただし、author_book のように同じテーブルを参照しないクロス テーブルの場合、isCrossRef="true" を設定すると、次のことが可能になります。

$author = new Author();
$author->setBooks($bookCollection);

それを念頭に置いて、「新しい人」フォームで人の「親」を直接選択することもできません...

友人のような関係には、次のことを可能にするEqualNestBehaviorがあります。

$person = new Person();
$person->setFriends($personCollection);

ただし、階層を気にしないため、その動作は親子関係には適用できないようです (特定の「人」の「親」を取得しようとすると、その「人」の「子」がすべて取得されます)。その「親」に加えて...)。これは、人の友人がその人の友人でもある「友人のような」関係に期待される動作です。

親/子の場合にEqualNestBehaviorを使用する方法はありますか? または、この種の関係を処理するための他の Propel 動作またはメソッドはありますか?

4

1 に答える 1

1

よくわかりませんEqualNestBehaviorが、次のようにワークフローを設定できます。

Personスキーマで、FK をテーブルに定義します。

<table name="person">
    <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="name" type="VARCHAR" size="100" required="true"/>
</table>
<table name="person_parent">
    <column name="person_id" type="INTEGER" primaryKey="true" required="true"/>
    <column name="parent_id" type="INTEGER" primaryKey="true" required="true"/>
    <foreign-key foreignTable="person" name="p1" onDelete="CASCADE" onUpdate="CASCADE">
        <reference local="person_id" foreign="id"/>
    </foreign-key>
    <foreign-key foreignTable="person" name="p2" onDelete="CASCADE" onUpdate="CASCADE">
        <reference local="parent_id" foreign="id"/>
    </foreign-key>
</table>

その後、モデルを生成すると、次のようなメソッドが得られます。

$person = new Person();
$person->getPersonParentsRelatedByParentId();
$person->setPersonParentsRelatedByParentId($personCollection);

$person->getPersonParentsRelatedByPersonId();
$person->setPersonParentsRelatedByPersonId($personCollection);

セッターはPropelCollection引数として受け入れます。

この状況は、「親を得る」とか「子を得る」ではなく、関連する要素として考える必要があります。

于 2012-08-23T05:37:33.473 に答える