CakePHP模型之间的两种关系

时间:2015-11-18 12:33:22

标签: mysql database cakephp cakephp-2.0

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

从上面你可能已经发现表'pictures'充当图像存储库,并且与多个模型相关,包括“资产”。

我希望模型'Asset'(表'assets')具有:

  1. hasMany'Picture'的关系(使用表格'assets_pictures'
  2. hasOne'Cover'的关系(表格'pictures'),基于与'cover_id'相关联的'assets'中的'Picture.id'字段
  3. 到目前为止,当我在HABTMAsset以及Picture之间建立'Asset' belongsTo 'Cover'关系时似乎有效。不知怎的,这听起来不对,而且更改资产的封面图片会消除HABTM中该资产的所有'assets_pictures'关系,所以我知道这里有些不对劲。我很遗憾......

1 个答案:

答案 0 :(得分:0)

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

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

表示这种情况的正确方法是在assets_pictures表中包含'type'字段:

many to many relationship with additional data

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

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

然而,“丰富的”HABTM关系会让事情变得复杂,尤其是在尝试保存数据时 。如果发生这种情况,并且在拔出头发之前,您可能需要沿着'hasMany through'路线前进。

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

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