1

私は、1対多の自己関係を持つテーブル「人」、「母」と「父」を持っています。もちろん人です。そのため、「person」テーブルには、同じテーブル内の他の行を指す「mother_id」と「father_id」という 2 つのオプション フィールドがあります。

BELONGS_TO、HAS_ONE、または両方を使用する必要がありますか?

母親と父親はオプションであり、システムの観点からは孤児は有効なエンティティであり、もちろん母親または父親は、父親/母親として彼/彼女を指す実在の人物以外に特定の区別がないことに注意することが重要です.

また、システムは誰かの子供を知ることとは無関係であるため、特定の人の両親を知ることだけが重要であることに言及することも重要です。

4

2 に答える 2

2

次のような組み合わせを使用できます。

return array(
    'father' => array(self::BELONGS_TO, 'Person', 'father_id'),
    'mother' => array(self::BELONGS_TO, 'Person', 'mother_id'),
    'mothersChildren' => array(self::HAS_MANY, 'Person', 'mother_id'),
    'fathersChildren' => array(self::HAS_MANY, 'Person', 'father_id'),
);

したがって、各人には複数の子供がいる可能性がHAS_MANYあるため、子供には ではなくが必要です。HAS_ONE

また、問題のあるリレーションは children リレーションであることもわかりますLEFT JOIN person c ON t.mother_id=c.id OR t.father_id=c.id。Yii のリレーションでは定義できないような JOIN を使用する必要があります。したがって、2 つのリレーションを定義し、getter を記述しgetChildren()てユニオンmothersChildrenfathersChildrenリレーションを作成できます。

于 2013-10-24T06:33:29.103 に答える