特定の関連付けを設定する方法がわかりません。
次のモデルを検討してください: アイテム、フォルダー、ファイル、所有者 (これは、私が達成しようとしているものと同様の簡単な例です)
フォルダとファイルはアイテムであり、アイテムには所有者がいます。
データベースは次のようになります。
items
id, is_folder, is_file, field_common_to_folders_and_files
folders
id, item_id, special_folder_field
files
id, item_id, special_file_field
owners
id, name
items_owners
id, item_id, owner_id
それで...
- アイテム hasOne フォルダー (is_folder の場合)
- アイテム hasOne ファイル (is_file の場合)
アイテム hasAndBelongsToMany 所有者
フォルダーの所属アイテム
ファイルの所属アイテム
...ファイルコントローラーで:
$this->File->id = $id;
$data = $this->File->read();
pr($data);
出力:
[File] => Array (
[id] => 100
[item_id] => 150
[special_file_field] => 'Only files do this'
)
[Item] => Array (
[id] => 150
[is_folder] => 0
[is_file] => 1
[field_common] => 'Both folders and files do this'
)
...しかし、id=x、item_id=150、および owner_id=10 の items_owners のエントリを想定すると、取得できません...
[Owner] => Array (
0 => Array (
[id] => 10
[name] => 'Me'
)
)
(Cake に File->Item->Owner を取得してもらいたい) 何か不足していますか?
私が試したが行き詰まっている別のアプローチは、フォルダーとファイルの両方でHABTMを定義することですが、結合テーブルのitem_idは、item_idフィールドを使用する必要があるときにフォルダーとファイルのidフィールドを使用しますが、そうではないようですこれをオーバーライドするための HABTM のオプションです (foreignKey と associationForeignKey を設定できますが、主キー [?] は設定できません)。
もちろん、Folder と File の両方で HABTM リレーションシップを定義し、2 つの結合テーブル (folders_owners と files_owners) を作成することも有効な方法の 1 つですが、1) オーナーとドンだけでなく、より多くのリレーションシップがあるため、助けを求めたいと思いました。それぞれ2つ持ちたくない、そして2)明らかな何かが欠けているように感じるので、これは私を悩ませています。
どんなアイデアでも大歓迎です。
ありがとう。