首页 文章

CakePHP模型之间的两种关系

提问于
浏览
0

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

从上面你可能已经知道表 'pictures' 用作图像的存储库并且与多个模型相关,包括'assets' .

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

  • hasMany'Picture' 的关系(使用表 'assets_pictures'

  • hasOne'Cover' (表 'pictures' )的关系,基于与 'Picture.id' 关联的 'assets' 中的 'cover_id' 字段

到目前为止,当我在 AssetPicture 以及 'Asset' belongsTo 'Cover' 之间 Build HABTM 关系时,它似乎有效 . 不知怎的,这听起来不对,而且更改资产的封面图片会消除该资产的所有 'assets_pictures' 关系,所以我知道了一些损失......

1 回答

  • 0

    这听起来不对,因为您在数据库级别的两个表之间设置了多个关系 . 不知道哪些,但这肯定打破了一些数据库规范化规则 .

    想象一下,您稍后决定不仅要追踪封面,还要追踪背面 . 您必须在资产表中添加另一个名为back_id的字段,该字段将指向图片 . 真是个烂摊子......

    表示这一点的正确方法是在assets_pictures表中包含一个'type'字段:

    many to many relationship with additional data

    您可以将此字段默认为“正常”(或甚至为空),并在需要时将其更改为“覆盖” . 注意,该字段允许附加图片类型(例如“后退”) .

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

    但是,事情可能会变得复杂,特别是 when trying to save data . 如果发生这种情况,并且在拔出头发之前,您可能需要沿着'hasMany through'路线走下去 .

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

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

相关问题