0

(より良い例がないため) モデル Person と別のモデル Twin (双子のペアを意味する) があるとします。Twins には、(Person 内の) 2 人の異なる人物の id フィールドを参照する first_born_id と second_born_id などの 2 つの Person 外部キーがあります。Cake で関係を設定するにはどうすればよいですか?

Twin は次のようなものになると思います。

$belongsTo = array('FirstBorn' => array('className' => 'Person',
                                        'foreignKey' => 'firstborn_id'),
                   'SecondBorn' => array('className' => 'Person',
                                         'foreignKey' => 'secondborn_id'));

しかし、Person を設定するにはどうすればよいですか? 私はそれを次のように行うことができます:

$hasOne = array('TwinAsFirstborn' => array('className' => 'Twin',
                                           'foreignKey' => 'firstborn_id'),
                'TwinAsSecondborn' => array('className' => 'Twin',
                                           'foreignKey' => 'secondborn_id'));

しかし、Person があり、その双子について知りたい場合は、両方の関係を確認する必要があります。Person が Twin 関係にあることができる 2 つの方法のいずれかを表す "Twin" 関係を Person で取得する方法があることを望んでいると思います。

または、これを設定するより良い方法はありますか?

4

2 に答える 2

1

Twin の例が少しややこしいことに同意します。Productモデル (この例では Twin) があり、常に 2 つComponentのモデルが関連付けられていると仮定します。

components: id - name
products: id - component1_id - component2_id

次のように製品を設定します。

var $belongsTo = array(
    'Component1' => array(
        'className' => 'Component',
        'foreignKey' => 'component1_id'
    ),
    'Component2' => array(
         'className' => 'Component',
         'foreignKey' => 'component2_id'
    )
);

およびコンポーネントとして:

var $hasMany = array(
    'ProductWithComponentAsComponent1' => array(
        'className' => 'Product',
        'foreignKey' => 'component1_id'
    ),
    'ProductWithComponentAsComponent2' => array(
        'className' => 'Product',
        'foreignKey' => 'component2_id'
    )
);

基本的に、あなたはに置き換える必要がありhasOneますhasMany。各コンポーネントには、それが最初のコンポーネントである多くの製品があります。同時に、それが 2 番目のコンポーネントである多くの製品があります。物事が明確になることを願っています。

EDIT 1: (ああ、「ProductWithComponentAsComponent#」は説明のためだけのものです。実際のモデルに応じて、短くて甘いエイリアスを保持できます。)

編集 2: hasOne リレーションシップを使用するための簡単な経験則 - 単一のテーブルを多数に分割する場合にのみ使用します (ユーザー/プロファイルなど)。

編集 3:コンポーネントのすべての製品が必要な場合は、2 つの方法でこれを行うことができます。

false(A) hasMany リレーションのように、foreignKey を定義します。

var $hasMany = array(
    'Product' => array(
        'className' => 'Product',
        'foreignKey' => false,
        'conditions' => array(
            'or' => array(
                "Product.component1_id = Component.id",
                "Product.component2_id = Component.id"
            )
        )
    )
);

(B) 上記の方法がうまくいかない場合 (Cake の動作がおかしくなることがあります)、結合を使用して従わせることもできます。次のように Component モデルに関数を作成します。

function fetchProducts($id) {
    if (!$id) {
        return null;
    }
    return $this->Product->find('all', array(
        'fields' => array('Product.*'),
        'joins' => array(
            array(
                'table' => 'components',
                'alias' => 'Component',
                'foreignKey' => false,
                'type' => 'inner',
                'conditions' => array(
                    'or' => array(
                        "Product.component1_id = Component.id",
                        "Product.component2_id = Component.id"
                    ),
                    'Component.id' => $id
                )
            )
        )
    ));
}
于 2011-01-05T18:47:19.203 に答える
0

なぜこのように双子を定義するのですか?

双子、第一子または第二子は人です。彼らを親に関連付けるのは、彼らが「子供」であり、「生年月日」が同じであるという事実です。

だからあなたは次のようなことをしませんか?

個人 -> ID、名前、年齢、生年月日、Parent_ID

parent_ID は childs レコードに格納され、親の下のすべての子を比較して双子が決定されます。DOB?

これにより、cakePHP の関係をセットアップするのが簡単になりますか?

于 2011-01-05T13:20:12.640 に答える