Я не уверен, как создать определенную ассоциацию.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) это подслушивает меня, потому что мне кажется, что я пропустил что-то очевидное.
Любые идеи были бы весьма признательны.
Спасибо.
Это сработало. Спасибо! Я оставлю этот вопрос для других. – Synexis