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

所以...

  • 项目有一个文件夹(如果是_文件夹)
  • 项目有一个文件(如果是_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'
)

...但是,假设 items_owners 中有一个条目,其中 id=x、item_id=150 和 owner_id=10,我不明白...

[Owner] => Array (
    0 => Array (
        [id] => 10
        [name] => 'Me'
    )
)

(我想让 Cake 获得 File->Item->Owner)我错过了什么吗?

我尝试但坚持的另一种方法是在文件夹和文件中定义 HABTM,但是当我需要它使用 item_id 字段时,连接表中的 item_id 使用文件夹和文件的 id 字段,并且似乎没有是 HABTM 中的一个选项来覆盖它(您可以设置 foreignKey 和 associationForeignKey,但不能设置主键[?])。

当然,一种可行的方法是在文件夹和文件中定义 HABTM 关系并创建两个连接表(folders_owners 和 files_owners),但我想寻求帮助,因为 1)我有更多的关系,而不仅仅是所有者和不'不想每个都有 2 个,并且 2)这让我很烦恼,因为感觉就像我错过了一些明显的东西。

任何想法将不胜感激。

谢谢。

4

1 回答 1

0

Synexis,你有点回答了你自己的问题:

“我想让 Cake 获得 File->Item->Owner”

我猜您的 filesController 表单目前是这样的(假设您使用的是 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');

在你的控制器中:

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

相反,将表单更改为以下内容:

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');

在你的控制器中:

$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);

你有它。

于 2013-06-27T08:47:29.573 回答