2013-06-27 27 views
1

我不確定如何建立某種關聯。HABTM通過屬於,可能嗎?

考慮以下型號:項目,文件夾,文件,業主 (這是類似於我想要實現的東西簡化的例子)

文件夾和文件的項目,並且項目所有者。

數據庫可能是這樣的:

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所有者

  • Folder be longsTo項目

  • 文件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使用文件夾和文件的ID字段,在HABTM中似乎沒有一個選項可以覆蓋它(你可以設置foreignKey和associationForeignKey,但不能設置主鍵[?])。

當然,一種可行的方法是在文件夾和文件中定義HABTM關係,並創建兩個連接表(folders_owners和files_owners),但我想尋求幫助,因爲1)我有更多的關係只是業主,並不想每個都有2個,而且2)這讓我感到困擾,因爲它感覺像是我失去了明顯的東西。

任何想法將不勝感激。

謝謝。

回答

0

Synexis,你有點回答了自己的問題:

「我想蛋糕拿到文件 - >用品 - >所有者」

我猜你的形式filesController目前像這樣(假設你使用表單助手):

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

有你有它。

+0

工作。謝謝!我會在這裏爲其他人留下這個問題。 – Synexis