HABTM通过BelongsTo,可能吗?

时间:2013-06-27 08:03:02

标签: cakephp relational-database

我不确定如何建立某种关联。

考虑以下模型:项目,文件夹,文件,所有者 (这是类似于我想要实现的类似的简化示例)

文件夹和文件是项目,项目有所有者。

数据库可能如下所示:

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)
  • Item hasAndBelongsToMany Owner

  • 文件夹所属项目

  • 文件belongesTo项目

...在文件控制器中:

$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使用Folder和File的id字段,并且没有似乎是HABTM中的一个选项来覆盖它(你可以设置foreignKey和associationForeignKey,但不能设置主键[?])。

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

非常感谢任何想法。

感谢。

1 个答案:

答案 0 :(得分: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);

你有它。