2013-06-27 3 views
1

Я не уверен, как создать определенную ассоциацию.HABTM через BelongsTo, возможно?

Рассмотрим следующие модели: товары, папки, файлы, владельцы (это упрощенный пример нечто похожее на то, что я пытаюсь добиться)

Папки и файлы являются товары, и товары имеют владельцев.

база данных может выглядеть следующим образом:

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 

так ...

  • Item hasOne Папка (если is_folder)
  • Пункт hasOne файла (если is_file)
  • Пункт hasAndBelongsToMany Владелец

  • Папка be 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, и не существует Кажется, что в HABTM опция для переопределения (вы можете установить foreignKey и associationForeignKey, но не первичные ключи [?]).

Конечно, один из подходов, который будет работать, заключается в определении отношений HABTM как в папке, так и в файле и создании двух таблиц соединений (folders_owners и files_owners), но я хотел обратиться за помощью, потому что 1) у меня есть еще много отношений, чем просто владельцы и не хотят иметь по 2 штуки, а 2) это подслушивает меня, потому что мне кажется, что я пропустил что-то очевидное.

Любые идеи были бы весьма признательны.

Спасибо.

ответ

0

Synexis, вы как бы ответили на свой вопрос:

"Я хотел бы, чтобы получить торт Файл-> item-> Владелец"

Я предполагаю вашу форму для 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); 

И там у вас есть.

+0

Это сработало. Спасибо! Я оставлю этот вопрос для других. – Synexis