Сначала позвольте мне объяснить, чего я пытаюсь достичь.
3 таблицы MySQL имеют отношение к этому вопросу:
Предварительные настройки:
id | name | description | user_id | ...
файлы:
id | name | size | ...
files_presets
id | file_id | preset_id | original_image (bool) | small_thumb (bool) | big_thumb (bool) | file (bool)
На этом сайте я создаю форму, предназначенную для создания пресетов.
Предустановка состоит из:
files
Таблицаfiles
Таблицаpresets
ТаблицаВсе файлы загружаются через AJAX заранее, поэтому при отправке формы все файлы уже находятся в базе данных, и их идентификаторы отправляются через скрытый ввод вместе со всей предустановленной информацией.
files_presets
Таблица — это то, что я использую, чтобы связать каждый пресет с его файлами и изображениями. Столбцы original_image, small_thumb, big_thumb и file являются логическими значениями, которые указывают, что каждый файл означает для предустановки.
Итак, вот как я определил свои ассоциации в PresetsTable.php
файл:
$this->belongsToMany('OriginalImage', [
'through' => 'FilesPresets',
'className' => 'Files',
'property_name' => 'original_image',
'foreignKey' => 'preset_id',
'targetForeignKey' => 'file_id',
'conditions' => ['FilesPresets.original_image' => true]
]);
$this->belongsToMany('SmallThumb', [
'through' => 'FilesPresets',
'className' => 'Files',
'property_name' => 'small_thumb',
'foreignKey' => 'preset_id',
'targetForeignKey' => 'file_id',
'conditions' => ['FilesPresets.small_thumb' => true]
]);
$this->belongsToMany('BigThumb', [
'through' => 'FilesPresets',
'className' => 'Files',
'property_name' => 'big_thumb',
'foreignKey' => 'preset_id',
'targetForeignKey' => 'file_id',
'conditions' => ['FilesPresets.big_thumb' => true]
]);
$this->belongsToMany('Files', [
'through' => 'FilesPresets',
'className' => 'Files',
'property_name' => 'files',
'foreignKey' => 'preset_id',
'targetForeignKey' => 'file_id',
'conditions' => ['FilesPresets.file' => true]
]);
Таким образом, я могу получить все изображения и файлы, связанные с пресетом, выполнив что-то вроде этого (без проблем здесь):
$preset = $this->Presets->get($id, [
'contain' => [
'OriginalImage', 'SmallThumb', 'BigThumb', 'Files'
]
]);
Проблема в:
Я получаю всевозможные ошибки при попытке сохранить эти данные.
Что я должен сделать:
presets
таблица (имя, описание и т. д.)files_presets
таблица для каждого из файлов, связывая их с только что созданным пресетом, а также сохраняя другую информацию (логические столбцы)Имейте в виду, что я не хочу создавать новые записи для files
таблица, так как файлы уже есть в базе данных и у меня есть их идентификаторы. Я просто хочу связать их идентификаторы с новым пресетом.
Заранее спасибо за помощь,
Дэниел.
Одна вещь, которую вы можете попробовать, это использовать псевдоним вместо className:
$this->belongsToMany('OriginalImage', [
'through' => 'FilesPresets',
'className' => 'Files',
'property_name' => 'original_image',
'foreignKey' => 'preset_id',
'targetForeignKey' => 'file_id',
'conditions' => ['OriginalImage.original_image' => true] // <-- Changed `FilePresets` to `OriginalImage` alias.
]);
Когда Cake генерирует SQL, он использует псевдоним вместо базового className, чтобы избежать конфликтов между несколькими ассоциациями с одной и той же целевой таблицей.
Других решений пока нет …