CakePHP 两个模型之间的关系

CakePHP Two Relationships Between Models

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

根据上面的内容,您可能已经想到 table 'pictures' 作为图像存储库并与多个模型相关,包括 'assets'。

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

  1. hasMany'Picture' 的关系(使用 table 'assets_pictures'
  2. hasOne'Cover' 的关系(table 'pictures'),基于 'assets' 中与 [=22] 关联的 'cover_id' 字段=]

到目前为止,当我在 AssetPicture 以及 'Asset' belongsTo 'Cover' 之间设置 HABTM 关系时,它似乎工作正常。不知何故,这听起来不对,而且更改资产的封面图片会消除该资产 'assets_pictures' 中的所有 HABTM 关系,所以我知道这里有问题。我很茫然...

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

想象一下,后来您决定不仅要跟踪封面,还要跟踪背面。您必须向名为 back_id 的资产 table 添加另一个字段,它会指向图片。真是一团糟...

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

您可以将此字段默认为 "normal"(甚至为空),并在需要时将其更改为 "cover"。请注意,此字段允许其他图片类型(例如 "back")。

HABTM 关系可以毫无问题地解决这个问题。参数 'unique'=>'keepExisting' 防止 CakePHP 删除其他已经存在的关系(这是默认行为)。

但是,'rich' HABTM 关系会使事情变得复杂,尤其是在 尝试保存数据时 。如果发生这种情况,在你拔头发之前,你可能想走 'hasMany through' 路线。

为了方便和检索信息,您可能需要为模型资产中的封面设置一个额外的 HABTM 关系,看起来像这样:

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