0

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

我有“users”、“groups”和“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')
    ));
}

每次我尝试显示数据时,都会收到错误消息 Error: ..... Unknown column 'Users.UserName' in 'where Clause'

它向我展示了它试图运行的 SQL: SELECT Groupsid, ... 从accounts. 在groups哪里。='testuser1'GroupsUsersUserName

显然,表之间的关联没有正确发生,并且它发送的 SQL 查询没有正确连接,但我不知道这里出了什么问题。我尝试过像这样的品种

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

诸如此类的东西,但似乎没有任何效果。

帮助!

4

2 回答 2

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')
    ));
}
于 2013-08-05T05:08:38.840 回答
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);

(感谢您 ned stark 指出需要一个单一的“用户”。我还不能以我有限的声誉来支持您的答案。)

“$this->set(.....);” 行是仅将组名数组传递给要使用的视图。

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

于 2013-08-13T14:56:55.093 回答