Сохранение нескольких принадлежащих ToMany ассоциаций в CakePHP 3

Сначала позвольте мне объяснить, чего я пытаюсь достичь.

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)

На этом сайте я создаю форму, предназначенную для создания пресетов.
Предустановка состоит из:

  • 3 изображения: одно original_image, одно small_thumb и одно big_thumb, все они хранятся в 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 таблица, так как файлы уже есть в базе данных и у меня есть их идентификаторы. Я просто хочу связать их идентификаторы с новым пресетом.

Заранее спасибо за помощь,
Дэниел.

0

Решение

Одна вещь, которую вы можете попробовать, это использовать псевдоним вместо 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, чтобы избежать конфликтов между несколькими ассоциациями с одной и той же целевой таблицей.

0

Другие решения

Других решений пока нет …