2015-11-18 136 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

太棒了!我很高興它有幫助。 –