2015-11-18 89 views
0

我有以下表之间:'assets', 'pictures', 'assets_pictures', 'othermodels', 'othermodels_pictures',等...CakePHP的两个关系模型

从上面的你可能已经想通表'pictures'作为图像库,并与多个车型,其中包括资产”。

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

  1. hasMany关系与'Picture'(使用表'assets_pictures'
  2. hasOne关系与'Cover'(表'pictures')的基础上,'assets'一个'cover_id'场与'Picture.id'

到目前为止,当我在AssetPicture'Asset' belongsTo 'Cover'之间设置HABTM关系时似乎工作。不知何故,这听起来不对,此外,更改资产的封面图片会清除'assets_pictures'中关于该资产的所有HABTM关系,所以我知道这里有些问题。我迷路了...

+0

probabily你必须设置'”独特的'=>'keepExisting'在设置您的HABTM关系时,请查看[手册](http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html# hasandbelongstomany-habtm) – arilia

回答

0

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

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

代表正确的方法是包括在assets_pictures表中的“类型”字段:

many to many relationship with additional data

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

HABTM关系可以解决这个问题,而没有太多问题。参数'unique'=>'keepExisting'可以防止CakePHP放弃已经存在的其他关系(这是默认行为)。

但是,事情会因为'富有'的HABTM关系而变得复杂,尤其是当试图保存数据时。如果发生这种情况,在拔出头发之前,您可能需要沿着'hasMany through'的路线走。

为了方便,并检索信息,你可能要建立在模型资产为封面的附加HABTM关系,这将是这个样子:

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

感谢百万英尼弗洛雷斯...!这很有道理! –

+0

太棒了!我很高兴它有帮助。 –