2013-08-02 111 views
0

我一直沒能找到解決這個問題的解決方案。我試圖查詢我的數據庫中的用戶所屬的組列表。用戶可以在多個組中,並且組可以有多個用戶。CakePHP從habtm檢索數據

我有「用戶」,「組」和「groups_users」表。每個都有一個「id」字段,「groups_users」表有兩個其他字段,「group_id」和「user_id」。

我認爲所有的表格都正確組成。

我user.php的,和Group.php模型文件看起來像這樣

//app/Model/User.php 
class User extends AppModel { 
    public $recursive = 1; 
    public @hasAndBelongsToMany = array(
     'Group' => array(
      'className' => 'Group', 
      'joinTable' => 'groups_users', 
      'foreignKey' => 'user_id', 
      'associationForeignKey' => 'group_id' 
     ) 
    ); 
} 

//app/Model/Group.php 
class Group extends AppModel { 
    public $recursive = 1; 
    public @hasAndBelongsToMany = array(
     'User' => array(
      'className' => 'User', 
      'joinTable' => 'groups_users', 
      'foreignKey' => 'group_id', 
      'associationForeignKey' => 'user_id' 
     ) 
    ); 
} 

然後,在我的控制文件中我有這個

//app/Controller/ProjectController.php 
class ProjectController extends AppController { 
    public $uses = array('Groups', 'Users'); 
    ... 
    $this->set('groupsForUser', $this->Groups->find('all', array(
     'conditions' => array('Users.UserName' => 'testuser1') 
    )); 
} 

每次我試圖顯示的數據,我收到錯誤消息 錯誤:.....'Where子句'中的未知列'Users.UserName'

它顯示m e它試圖運行的SQL: SELECT Groupsid,...從accountsgroups AS Groups其中Users。 ''testuser1'

很明顯,表之間的關聯沒有正確地發生,它發送的SQL查詢沒有正確連接,但我無法弄清楚這裏出了什麼問題。我試過品種,如

.....$this->Groups->Users->find(.... 

而這樣的東西,但似乎沒有任何工作。

幫助!

回答

0

我不得不採取完全不同的方法解決問題。它主要是「Cake-y」。

我簡化模型通過取出$遞歸位位和下調的HABTM部分,去掉joinTable,外鍵和associationForeignKey位)

的ProjectController拿到代碼:

public $uses = array('Group', 'User'); 
$arrayGroupsForUser = array(); 
.... 
$results = $this->User->Find('first', array(
    'conditions' => array('User.UserName' => 'testuser1') 
)); 

foreach($results['Group'] as $result) { 
    array_push($arrayGroupsForUser, $result['name']); 
} 
$this->set('groupsForUser', $arrayGroupsForUser); 

(謝謝內爾斯塔克注意到需要一個單獨的「用戶」,我無法用我有限的聲望向你提供答案)

「$ this-> set(.....); 「行只是將組名稱數組傳遞給View以使用。

此鏈接http://rottmann.net/2012/07/cakephp-hasandbelongstomany-relationship-queries-demystified/幫助我解決了這個問題。

1

我想你應該在你的ProjectController.php中使用「User.UserName」而不是「Users.UserName」,因爲你的關聯中有「User」所以模型名稱應該是相同的。

//app/Controller/ProjectController.php 
class ProjectController extends AppController { 
    public $uses = array('Groups', 'User'); 
    ... 
    $this->set('groupsForUser', $this->Groups->find('all', array(
     'conditions' => array('User.UserName' => 'testuser1') 
    )); 
} 
+0

這似乎不是問題所在。我試着改變它,但沒有效果。它將其提交給MySQL數據庫的SQL查詢更改爲「SELECT Groups.id,... FROM accounts.groups AS Groups WHERE User。UserName ='testuser1'「 – AgileTiger

+0

這似乎沒有問題,我試着改變它(和組到組),但沒有任何作用。它將它提交給MySQL數據庫的SQL查詢更改爲: 「SELECT Groups.id,... FROM accounts.groups AS Groups WHERE User.UserName ='testuser1'」 (注意查詢中單數的「User.UserName」而不是複數) 查詢本身isn不包括表之間正確的連接,所以它不能查詢Groups模型外的任何東西,必須有些東西與連接混淆,但我不知道它可能是什麼。 – AgileTiger