2013-11-27 184 views
2

嘗試屬於用戶(用戶有很多嘗試)。CakePHP:hasMany association not recognized

在user.php的(模型)

public $hasMany = array (
    'Attempt' => array(
     'className'  => 'Attempt', 
     'order' => 'modified DESC' 
    ), 
); 

在Attempt.php(模型)

public $belongsTo = array (
     'Test' => array ('className' => 'Test', 'foreignKey'=>'test_id', 'order' => 'Test.created DESC'), 
     'User' => array ('className' => 'User', 'order' => 'User.created DESC') 
    ); 

在控制器中,我們構建此查詢...

$joins = array(

     array( 
      'table'=>'attempts', 
      'alias'=>'Attempt', 
      'type'=>'LEFT', 
      'conditions'=>array("Attempt.user_id = User.id AND Attempt.test_id != {$practice_test_id}") 
     ) 

    ); 

$conditions[] = array('Resume.has_file = 1'); 

$search_options = array('conditions'=>$conditions, 
    //'joins' => $joins, //<--I'M FORCED TO USER THIS TO GET THIS TO WORK 
    'contain' => array('Resume', 'Attempt', 'Tag'), 
    'order' => array('Attempt.score'=> 'DESC'), 
    'group' => 'User.id' 
); 
$paginator_settings = $search_options; 
$paginator_settings['limit'] = 25; 
$this->Paginator->settings = $paginator_settings; 

$resume_display_array = $this->Paginator->paginate('User'); 

(這裏看起來有點奇怪,因爲我在這個查詢的構造之間剝去了很多分散注意力的邏輯,其中大多數c onditions是基於用戶輸入動態構建的。)

當我忽略了$search_options['joins]這不起作用。我得到以下錯誤:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Attempt.score' in 'order clause' 

的SQL轉儲看起來是這樣的:

SELECT `User`.`id` 
FROM `users` AS `User` 
LEFT JOIN `resumes` AS `Resume` ON (`Resume`.`user_id` = `User`.`id`) 
WHERE `User`.`id` IN (
    SELECT `User1`.`id` FROM `users` AS User1 
    LEFT JOIN `tags_users` AS TagUser ON (`User1`.`id`= `TagUser`.`user_id`) 
    LEFT JOIN `tags` AS Tag ON (`TagUser`.`tag_id`= `Tag`.`id`) 
    WHERE `Tag`.`id` = (2)) AND `Resume`.`has_file` = 1 GROUP BY `User`.`id` 
ORDER BY `Attempt`.`score` DESC 
LIMIT 25 

爲什麼沒有得到自動包含在嘗試模型由於與用戶的關係的hasMany?

+0

如果您複製並粘貼到你的數據庫是SQL它返回的東西? Attempts表中是否存在「分數」列? –

回答

0

我在這裏沒有看到問題。事實上,你今天發佈的other question不是你的答案嗎?

But this is not the case with hasMany and hasAndBelongsToMany associations. Here is where forcing joins comes to the rescue. You only have to define the necessary joins to combine tables and get the desired results for your query.

所以,從我的理解,你談論的是一個hasMany時強制聯接關係,對不對?這就是您在使用$joins陣列時所要做的。由於User hasMany Attempt,那麼你必須強制加入。現在,如果您從Attempt的角度進行分頁,那麼這可能不是必需的。如果您執行$this->Paginator->paginate('Attempt');(更改必要的關係和條件),則不需要手動加入用戶表以獲取數據。

因此,如果Attempt本身沒有加入(按照文檔所述),那麼訂單條件會產生問題,因爲在另一個查詢中檢索到Attempt數據,並且表引用在第一個查詢中丟失。解決方案:加入,蛋糕的行爲如預期。

+0

另一個問題是關於CakePHP文檔中的衝突信息(與此問題相關的部分)。對我而言,預期的行爲應該是什麼?關於Paginator的「視角」的觀點非常重要,但是我們是不是將「用戶」模式分成了許多「嘗試」模式?所以我們不應該期望automagic在沒有強制加入的情況下工作嗎?在相關的情況下,在使用loadModel('User')之後,查詢是在不同的控制器中進行的。 – emersonthis

+0

我知道這不是一個重複的問題,我只是指出了,因爲我從那裏得到了解決方案。但看,如果我們分頁用戶模型,我們不應該指望automagic工作,因爲文檔說*它不會工作*除非你強制它,從哪個控制器你做的查詢無關:** hashMany和HABTM協會需要強制加入**。 – Nunser

+0

我知道這些文檔說,但它不適用於其他任何地方。我們還有其他幾個hasMany和hasAndBelongsToMany關聯的模型示例,它們自動出現而沒有任何連接。這就是神祕的基礎。但是,讓我們在那裏聊天或發佈後續評論,以免在這裏下車。 – emersonthis

0

我想你已經有了一個錯字在你的hasMany協會 - 的className有資本N.

我也想嘗試測試$this->User->recursive = 2; $this->User->find('first');,只是爲了看看它返回。如果結果不包括嘗試,我會假設你設置模型關係有什麼問題。

+0

謝謝。 'className'是我暫時修復的一個錯字。至於模特關係......他們在上面貼出來。你看到他們有什麼問題嗎? – emersonthis

+0

我沒有看到除className之外的其他任何東西。我只是建議檢查一下,因爲你看到的行爲就像協會不起作用。 – Kai

+1

我同意這不起作用。弄清楚爲什麼這個問題的重點。 – emersonthis

0

試試這個它會工作

$this->User->bindModel(array('hasMany' => array(
      'FollowUp' => array('className' => 'FollowUp', 'foreignKey' => 'publisher_id', 
      'fields' => array('amount'), 
     ), 
     'SchoolFollow' => array('className' => 'SchoolFollow', 'foreignKey' => 'publisher_id', 
      'fields' => array('amount'), 
     ), 
     'TravelerFollow' => array('className' => 'TravelerFollow', 'foreignKey' => 'publisher_id', 
      'fields' => array('amount'), 
     ), 
     $mdl . 'Cashback' => array('className' => $mdl . 'Cashback', 'foreignKey' => 'publisher_id', 
      'fields' => array('admin_comission_amount'), 
      'conditions' => array('status' => 'done') 
     ), 
)));