2012-02-16 21 views
0

我試過並嘗試過並試過,我不知道我做錯了什麼。我有一個簡單的場景,我有項目hasMany標記和標記belongsTo項目。CakePHP使用第二級深層模型關聯中的條件來操縱find()的返回

當我顯示所有當前項目的列表時,我想顯示每個標籤的列表。通過hasMany關係,標籤可以非常好地獲取,但是我希望在用戶點擊任何標籤時只需返回包含點擊標籤的項目就可以調節查找條件。

我明白,我不能操縱的hasMany我發現的情況選擇直接結合,而且我也明白,我需要利用unbindModel()bindModel(的)方法來建立一個臨時hasOne relationship where Project hasOne Tag。我以爲我會需要遵循的過程:

  • 解除綁定項目的hasMany標籤
  • 創建項目hasOne標籤的結合
  • 我會那麼能夠操縱在我的條件Tag.name場選項。

這是我在Project.php模型文件關係:

 public $hasMany = array(
     'Link' => array(
      'className' => 'Link', 
      'foreignKey' => 'project_id', 
      'dependent' => false, 
     ), 
     'Pledge' => array(
      'className' => 'Pledge', 
      'foreignKey' => 'project_id', 
      'dependent' => false, 
     ), 
     'ProjectPost' => array(
      'className' => 'ProjectPost', 
      'foreignKey' => 'project_id', 
      'dependent' => false, 
     ), 
     'Tag' => array(
      'className' => 'Tag', 
      'foreignKey' => 'project_id', 
      'dependent' => false, 
     ) 
    ); 

然後在我的Tag.php模型文件:

public $belongsTo = array(
    'Project' => array(
     'className' => 'Project', 
     'foreignKey' => 'project_id', 
    ) 
); 

所有型號使用可容忍的行爲。現在,我的ProjectsController.php文件中我修改綁定來實現hasOne關係,使我可以根據Tag.name值操縱的結果:

//我解除綁定的hasMany標籤關聯度 $這個 - > Project-> unbindModel(array('hasMany'=> array('Tag')));

// I am setting up a hasOne relationship where Project hasOne Tag 
    $this->Project->bindModel(array(
    'hasOne' => array(
     'MyTag' => array(
      'className' => 'Tag', 
      'foreignKey' => false, 
      'conditions' => array('MyTag.project_id = Project.id') 
     ) 
    ) 
    )); 

我再發出一個簡單的查找命令(對標籤沒有過濾器還):

$projects = $this->Project->find(
     'all', 
      array(
       'contain' => array(
        'MyTag', 
        'User.id' 
       ), 
       //'conditions' => $filters ? $filters : NULL, 
       'fields' => array(
        'Project.id', 'Project.name', 'Project.description' 
       ), 
      ) 
     ); 

現在,我只有在數據庫中的一個項目的記錄,但它有五個標籤。正在發生的事情是,它返回一個項目,但5倍,這裏是一個PR()結果:

Array 
(
    [0] => Array 
     (
      [Project] => Array 
       (
        [id] => 1 
        [name] => Test Project 01 
        [description] => Donec enim lacus 
       ) 

      [User] => Array 
       (
        [id] => 1 
       ) 

     ) 

    [1] => Array 
     (
      [Project] => Array 
       (
        [id] => 1 
        [name] => Test Project 01 
        [description] => Donec enim lacus 
       ) 

      [User] => Array 
       (
        [id] => 1 
       ) 

     ) 

    [2] => Array 
     (
      [Project] => Array 
       (
        [id] => 1 
        [name] => Test Project 01 
        [description] => Donec enim lacus 
       ) 

      [User] => Array 
       (
        [id] => 1 
       ) 

     ) 

    [3] => Array 
     (
      [Project] => Array 
       (
        [id] => 1 
        [name] => Test Project 01 
        [description] => Donec enim lacus 
       ) 

      [User] => Array 
       (
        [id] => 1 
       ) 

     ) 

    [4] => Array 
     (
      [Project] => Array 
       (
        [id] => 1 
        [name] => Test Project 01 
        [description] => Donec enim lacus 
       ) 

      [User] => Array 
       (
        [id] => 1 
       ) 

     ) 

) 

最奇怪的是,如果我這樣做能在MyTag的過濾器.NAME場(注意我用MyTag因爲我結合過程中更改類名),它按預期工作:

$projects = $this->Project->find(
     'all', 
      array(
       'contain' => array(
        'MyTag', 
        'User.id' 
       ), 
       'conditions' => array('MyTag.name' => 'NGO'), 
       'fields' => array(
        'Project.id', 'Project.name', 'Project.description' 
       ), 
      ) 
     ); 

以上的回報只是一個結果。 發生了什麼事?如何防止初始(未過濾)負載上的這種重複?

在此先感謝。

回答

0

我認爲你應該看看hasAndBelongsToMany的關係。 這就是我設置標籤行爲的方式。 祝你好運!

編輯

您將能夠做

$this->Project->find('first', array(
    'conditions' => array('Project.id' => $projectId), 
    'recursive' => 1 
)); 

// returns 
Array [ 
    Project => Array [...], 
    Tag => Array [all associated tags] 
] 

而且

$this->Project->Tag->find('first', array(
    'conditions' => array('Tag.id' => $tagId), 
    'recursive' => 1 
)); 

// returns 
Array [ 
    Tag => Array [...], 
    Project => Array [all associated projects] 
] 

是你不想要的東西?

+0

但是,這仍然不能解決能夠根據他們的標籤來操縱項目結果的問題嗎?據我所知,可以在find()查詢中操縱的唯一關聯是hasOne關聯,或者這是不正確的? – SimonDowdles 2012-02-17 09:37:07

+0

我編輯了我的帖子,如果這沒有幫助,我想我誤解了你的問題......祝你好運! – 2012-02-17 16:00:01

+0

@ issem danny - 我想我可以將項目作爲關聯返回給某個模型,但理想情況下,我只想使用Project模型,因爲顯示Project模型中所有項目的數據結構有所不同,而不是將所有項目都顯示爲Tag的關聯,例如,有道理?所以我基本上不得不使用兩組截然不同的數據,只是爲了過濾標籤。如果這是唯一的解決方案,那就這樣吧,我將不得不使它工作。非常感謝您的建議。我也可以用hasMany的方法來使用這個方法 – SimonDowdles 2012-02-22 10:57:08