1

特定の関連付けを設定する方法がわかりません。

次のモデルを検討してください: アイテム、フォルダー、ファイル、所有者 (これは、私が達成しようとしているものと同様の簡単な例です)

フォルダとファイルはアイテムであり、アイテムには所有者がいます。

データベースは次のようになります。

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)明らかな何かが欠けているように感じるので、これは私を悩ませています。

どんなアイデアでも大歓迎です。

ありがとう。

4

1 に答える 1

0

Synexis, you sort of answered your own question:

"I'd like Cake to get File->Item->Owner"

I'm guessing your form for filesController is currently something like this (assuming you are using FormHelper):

echo $this->Form->create('File');
echo $this->Form->input('id', array('hiddenField' => true));
echo $this->Form->input('special_file_field');
echo $this->Form->input('Owner', array('multiple' => 'checkbox');

And in your controller:

$this->File->saveAll($this->request->data);

Instead, change the form to the following:

echo $this->Form->create('Item');
echo $this->Form->input('id', array('hiddenField' => true));
echo $this->Form->input('File.id', array('hiddenField' => true));
echo $this->Form->input('File.special_file_field');
echo $this->Form->input('Owner', array('multiple' => 'checkbox');

And in your controller:

$this->File->id = $id;
$file = $this->File->read();
$this->File->Item->id = $file['File']['item_id'];
$data = $this->File->Item->read();
...
$this->File->Item->saveAll($this->request->data);

And there you have it.

于 2013-06-27T08:47:29.573 に答える