CakePHP从habtm中检索数据

时间:2013-08-02 17:49:23

标签: cakephp-2.1 has-and-belongs-to-many

我无法找到解决此问题的解决方案。我正在尝试查询我的数据库以查找用户所属的组列表。用户可以分为多个组,组可以有多个用户。

我有“用户”,“群组”和“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'
        )
    );
}

然后,在我的Controller文件中,我有这个

//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'

它向我展示了它试图运行的SQL: SELECT Groupsid,... FROM accountsgroups AS Groups WHERE UsersUserName = 'testuser1'

显然,表之间的关联没有正确发生,它发送的SQL查询没有正确连接,但我无法弄清楚这里出了什么问题。我尝试过像

这样的品种
.....$this->Groups->Users->find(....

这样的东西,但似乎没有任何效果。

帮助!

2 个答案:

答案 0 :(得分: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')
    ));
}

答案 1 :(得分:0)

我不得不对问题采取完全不同的方法。它主要是“Cake-y”。

我通过取出$ recursive位并删除了HABTM部分,删除了joinTable,foreignKey和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(.....);” line是将组名称数组传递给要使用的视图。

这个链接http://rottmann.net/2012/07/cakephp-hasandbelongstomany-relationship-queries-demystified/帮助我解决了这个问题。