在CakePHP 3中保存多个belongsToMany关联

时间:2014-12-31 23:12:44

标签: php mysql cakephp cakephp-3.0

首先让我解释一下我想要实现的目标。

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上传的,所以当提交表单时,所有文件都已存在于数据库中,并且他们的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与新预设相关联。

先谢谢你帮助我,
丹尼尔。

1 个答案:

答案 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,以避免多个关联到同一目标表之间的冲突。