CakePHPアプリケーションのtableA HABTM tableA関係を作成する最良の方法は何ですか?
-
03-07-2019 - |
質問
登録ユーザーが他の用途に自分自身を関連付けてファミリーを作成できるようにする機能を作成する必要があります。データベーステーブルは次のようになります。
db.persons -(ボブ、ジェーン、ティミーなど)
- id
- 名前
- メール
db.persons_persons
- id
- person__id_parent
- person_id_child
- relationtype_id
db.relationtypes -(配偶者、子供、neなど)
- id
- 名前
この構造を使用すると、persons_personsテーブルでBobがJaneの配偶者であることを指定できるはずです。 db.persons_personsのレコードは(psuedo)のようになります。
ID | person_parent | person_child | relationtype
1 | Bob | Jane | Spouse
2 | Bob | Timmy | Child
ボブとジェーンが結婚している場合、一方の子を他方に関連付ける必要があるため、これによりデータの断片化が発生する可能性があることを認識しています。しかし、それは私の質問ではありません。私の質問は、このデータベースのセットアップがcakePHPアプリケーションで使用するための「最も正しい」かどうかです。
解決
まず、CakePHPは自動的に people
テーブルを people
コントローラーと person
モデルに反映するため、呼び出す必要はありません。 persons
。次に、 persons_persons
ではなく、ルックアップテーブル relationships
を呼び出します。
リレーションシップテーブルのフィールド person_id
、 relation_id
および relation_type_id
を呼び出してから、にアンダースコアを追加します
になります。
これはセマンティックだと思います。
hasAndBelongsToManyアソシエーションを引き続き使用し、オートマジック" with "関連タイプのHABTMテーブルの追加データにアクセスするためにCakePHP(1.2のみ)が提供する関連付け。
しかし、私は使用したくなるでしょう:
-
Person
hasManyRelation
-
Relation
belongsToPerson
、Relation
、RelationType
あなたのアプリでは、人との関係は他の人との関係によって暗示されていますか?つまりPerson.id = 1を見つけた場合、すべての関係を取得できます。 Person.id 2、3、および4。ただし、Person.id 2が見つかった場合、そのリレーションシップを表すリレーションテーブルに別のレコードがない限り、Person.id = 1を自動的に取得しません。
これを達成するために、別のアソシエーションを設定できます:
-
Person
hasFormanKeyperson_id
を持つhasMany -
Person
hasManyRelation2
with foreignKeyrelation_id
-
Relation
belongsToPerson
、Relation
、RelationType
Relation1
注、このHABTMとの二重の関係も実現できます。