我无法找到解决此问题的解决方案。我正在尝试查询我的数据库以查找用户所属的组列表。用户可以分为多个组,组可以有多个用户。
我有“用户”,“群组”和“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 Groups
。id
,... FROM accounts
。groups
AS Groups
WHERE Users
。UserName
= 'testuser1'
显然,表之间的关联没有正确发生,它发送的SQL查询没有正确连接,但我无法弄清楚这里出了什么问题。我尝试过像
这样的品种.....$this->Groups->Users->find(....
这样的东西,但似乎没有任何效果。
帮助!
答案 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/帮助我解决了这个问题。