2012-02-08 42 views
0

我已經閱讀了大量文章,花了幾個小時瀏覽cakephp.org的文檔,甚至嘗試了各種實際的例子,我似乎無法得到這個對。我已經有3個表如下:CakePHP:在'find'條件下使用第二級深層模型關聯,返回重複結果

  • 項目
  • project_tags
  • 標籤

當有人增加了一個新的項目,他們選擇自己的標籤,這是從預定義的列表中選擇標籤表。然後使用project_id和tag_id字段將它們輸入的標籤存儲在project_tags中。

模型關係如下:

  • 項目的hasMany projectTag
  • projectTag屬於關聯項目
  • ProjectTag屬於關聯標籤

無論我有正確的關係,仍是微不足道的我,但我在這裏嘗試了許多可能性。

我想要做的是執行查找特定標記的所有項目。我已經通過執行以下操作做到了這一點:

$this->Project->contain(array('ProjectTag' => 'Tag', 'User' => array('id'))); 
$projects = $this->Project->find('all', array('conditions' => array('ProjectTag.tag_id' => '6'))); 

結果是一個SQL錯誤列ProjectTag.tag_id不存在。這告訴我,這個關聯有一個錯誤,但是在哪裏?

這是因爲我不能在使用可容忍的時候在我喜愛的條件下使用第二級深度關聯的hasMany模型?如果是這樣,我該如何解決這個問題?

我知道它很長,對不起。任何人都可以看到這種奇怪的情況?

我嘗試過的另一種方法是使用Project上的unbindModel(),刪除ProjectTag的所有綁定,然後使用bindModel()和ProjectTag.project_id = Project.id的條件添加hasOne,但是這導致了4條記錄同樣的項目返回,每個ProjectTag一個,這似乎不正確。

我正在使用可容納的行爲並在AppModel中設置了遞歸= -1。

任何幫助是極大的讚賞。 謝謝

回答

0

所有誰可以跨越這個崗位絆倒,試圖包括模型是2+深層次關聯您發現內或分頁查詢是不是一個簡單的任務,至少可以說。

不斷提出的第一點是CakePHP爲每個hasMany和hasAndBelongsToMany關聯執行單獨的查詢,使得幾乎不可能將它們包含在查找條件中。

我提交了2個解決方案:

1)建立一個自定義的查詢類型

2)使用unbindModel和bindModel功能和hasOne

重新創建協會

我選擇對於第2點來說,因爲第1點在閱讀文檔時似乎有問題(並且只是作爲最後的手段推薦),它允許我隨時更改關聯,並在之後重新設置關聯,並按照我的意願繼續愉快地關聯關聯。

對於那些有興趣的,我有一個模型項目,有許多ProjectTag belongsTo標籤。在我的查找類型中無法使用Tag或ProjectTag,所以我做了以下操作:

我在Project,ProjectTag和Tag上使用了unbindModel()方法,刪除了它們的所有關聯,實質上取消了所有關係的關聯。

然後,我將bindModel()應用於Project,ProjectTag和Tag。最重要的是我應用這些nindings的順序(層次結構),因爲我使用了'condition'屬性,該屬性允許我使用SQL WHERE條件將模型'A'鏈接到模型'B'。例如:

$this->Project->ProjectTag->unbindModel(array(
'belongsTo' => array('Tag') 
)); 

$this->Project->unbindModel(array('hasMany' => array('ProjectTag'))); 

$this->Project->bindModel(array('hasOne' => array('ProjectTag' => array('foreignKey' => false, 'conditions' => array('ProjectTag.project_id = Project.id'))))); 

$this->Project->bindModel(array('hasOne' => array('Tag' => array('foreignKey' => false, 'conditions' => array('Tag.id = ProjectTag.tag_id'))))); 

我們現在可以利用Tag.id的,如果它有一個項目的關係hasOne,基本上允許我們直接在標籤上找到適用條件,同時返回相關的項目。

要取消綁定所討論的模型使用的所有關係,或者會中斷,這是必需的。

我希望這可以幫助那些偶然發現同一問題的人。

+0

當你說「微不足道」時,我認爲你的真正含義是「不平凡」。 – eaj 2013-01-25 22:39:16

+0

@eaj - 非常正確;)已更新 – SimonDowdles 2013-02-07 08:41:21

2

你有問題,是你在模型中的關係錯了。 理想情況下,您的情況是關係hasAndBelongsToMany。

項目hasAndBelongsToMany標籤 標籤hasAndBelongsToMany Proyect

這是在這種情況下,自然的關係。 projectTag表只是一箇中間表,並不是cakephp中的一個模型。

瞭解更多信息:http://book.cakephp.org/1.3/view/1044/hasAndBelongsToMany-HABTM

+1

感謝您的建議。它並沒有解決我的過濾問題,但是當我使用hasAndBelongsTo Many關聯時,它確實爲我節省了很多麻煩,因爲我使用了許多hasMany綁定。 – SimonDowdles 2012-02-14 11:33:56

+0

plz,更新它不起作用的鏈接 – sanjeev 2015-09-23 09:34:27