CakePHP 两个模型之间的关系
CakePHP Two Relationships Between Models
我有以下 tables:'assets', 'pictures', 'assets_pictures', 'othermodels', 'othermodels_pictures'
,等等...
根据上面的内容,您可能已经想到 table 'pictures'
作为图像存储库并与多个模型相关,包括 'assets'。
我希望模型 'Asset'
(table 'assets'
) 具有:
hasMany
与 'Picture'
的关系(使用 table 'assets_pictures'
)
hasOne
与 'Cover'
的关系(table 'pictures'
),基于 'assets'
中与 [=22] 关联的 'cover_id'
字段=]
到目前为止,当我在 Asset
和 Picture
以及 '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'),
)
我有以下 tables:'assets', 'pictures', 'assets_pictures', 'othermodels', 'othermodels_pictures'
,等等...
根据上面的内容,您可能已经想到 table 'pictures'
作为图像存储库并与多个模型相关,包括 'assets'。
我希望模型 'Asset'
(table 'assets'
) 具有:
hasMany
与'Picture'
的关系(使用 table'assets_pictures'
)hasOne
与'Cover'
的关系(table'pictures'
),基于'assets'
中与 [=22] 关联的'cover_id'
字段=]
到目前为止,当我在 Asset
和 Picture
以及 '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'),
)