gpt4 book ai didi

mysql - CakePHP 模型之间的两种关系

转载 作者:行者123 更新时间:2023-11-29 21:49:34 25 4
gpt4 key购买 nike

我有以下表格:'assets'、'pictures'、'assets_pictures'、'othermodels'、'othermodels_pictures' 等...

从上面的内容中,您可能已经发现表'pictures'充当图像存储库,并且与多个模型相关,包括“ Assets ”。

我想要模型'Asset'(表'assets'),具有:

  1. hasMany'Picture' 的关系(使用表 'assets_pictures')
  2. hasOne'Cover'(表 'pictures')的关系,基于 'cover_id''Picture.id'
  3. 关联的 'assets' 中的字段

到目前为止,当我在 AssetPicture 之间设置 HABTM 关系时,它似乎有效,并且 'Asset' 属于 'Cover '。不知何故,这听起来不对,而且更改 Assets 的封面图片会清除该 Assets 的 'assets_pictures' 中的所有 HABTM 关系,所以我知道这里出了问题。我迷失了...

最佳答案

这听起来不对,因为您正在数据库级别的两个表之间设置多重关系。不确定是哪些,但这肯定违反了一些数据库规范化规则。

想象一下,稍后您决定不仅要能够跟踪封面,还要跟踪背面。您必须向 Assets 表添加另一个名为 back_id 的字段,该字段将指向图片。真是一团乱……

表示这一点的正确方法是在 asset_pictures 表中包含“类型”字段:

many to many relationship with additional data

您可以将此字段默认为“正常”(甚至为空),并在需要时将其更改为“覆盖”。请注意,此字段允许使用其他图片类型(例如“背面”)。

HABTM 关系可以解决这个问题,不会出现太多问题。参数'unique'=>'keepExisting'防止CakePHP删除已经存在的其他关系(这是默认行为)。

但是,“丰富”的 HABTM 关系会使事情变得复杂,尤其是在尝试保存数据时。如果发生这种情况,在拔掉头发之前,您可能需要先查看 'hasMany through'路线。

为了方便起见,并且为了检索信息,您可能需要在模型 Assets 中为 Cover 设置额外的 HABTM 关系,如下所示:

public $hasAndBelongsToMany = array(
'Cover' => array(
'className' => 'Picture',
'conditions' => array('AssetCover.type' => 'cover'),
)

关于mysql - CakePHP 模型之间的两种关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33780211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com