首先让我解释一下我想要实现的目标。
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上传的,所以当提交表单时,所有文件都已存在于数据库中,并且他们的ID通过隐藏输入和所有预设信息一起发送。
我使用files_presets
表将每个Preset链接到其文件和图像。 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
表创建新记录,因为文件已存在于数据库中并且我有自己的ID。我只想将他们的ID与新预设相关联。
先谢谢你帮助我,
丹尼尔。
答案 0 :(得分: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,以避免多个关联到同一目标表之间的冲突。