我有以下表格:'assets', 'pictures', 'assets_pictures', 'othermodels', 'othermodels_pictures'
等等......
从上面你可能已经发现表'pictures'
充当图像存储库,并且与多个模型相关,包括“资产”。
我希望模型'Asset'
(表'assets'
)具有:
hasMany
与'Picture'
的关系(使用表格'assets_pictures'
)hasOne
与'Cover'
的关系(表格'pictures'
),基于与'cover_id'
相关联的'assets'
中的'Picture.id'
字段到目前为止,当我在HABTM
和Asset
以及Picture
之间建立'Asset' belongsTo 'Cover'
关系时似乎有效。不知怎的,这听起来不对,而且更改资产的封面图片会消除HABTM
中该资产的所有'assets_pictures'
关系,所以我知道这里有些不对劲。我很遗憾......
答案 0 :(得分:0)
听起来不对,因为您在数据库级别的两个表之间设置了多个关系。不知道哪些,但这肯定打破了一些数据库规范化规则。
想象一下,您稍后决定不仅要追踪封面,还要追踪背面。您必须在资产表中添加另一个名为back_id的字段,该字段将指向图片。真是个烂摊子......
表示这种情况的正确方法是在assets_pictures表中包含'type'字段:
您可以将此字段默认为“正常”(或甚至为空),并在需要时将其更改为“覆盖”。请注意,此字段允许其他图片类型(例如“返回”)。
HABTM关系可以解决这个问题而不会出现太多问题。参数'unique'=>'keepExisting'会阻止CakePHP丢弃已经存在的其他关系(这是默认行为)。
然而,“丰富的”HABTM关系会让事情变得复杂,尤其是在尝试保存数据时 。如果发生这种情况,并且在拔出头发之前,您可能需要沿着'hasMany through'路线前进。
为方便起见,检索信息,您可能希望为模型资产中的Cover设置额外的HABTM关系,如下所示:
public $hasAndBelongsToMany = array(
'Cover' => array(
'className' => 'Picture',
'conditions' => array('AssetCover.type' => 'cover'),
)