【发布时间】:2012-11-05 22:23:56
【问题描述】:
更新 #2 - 找到解决方案: 原来我使用了这个查找:
$this->User->Group->find(....)
不是我需要的。要提取我需要使用的用户组:
$this->User->find('all',array('conditions' => array('User.id' => $user_id)));
更新#2>
我正在尝试在 Users 表和 Groups 表之间建立 HABTM 关系。问题是,当我发出这个电话时,我:
$this->User->Group->find('list');
发出的查询是:
SELECT [Group].[id] AS [Group__id], [Group].[name] AS [Group__name] FROM [groups] AS [Group] WHERE 1 = 1
此时我只能假设我已经错误地定义了我的关系,因为我希望行为会按照约定使用在数据库上定义的 groups_users 表。我的人际关系:
class User extends AppModel {
var $name = 'User';
//...snip...
var $hasAndBelongsToMany = array(
'Group' => array(
'className' => 'Group',
'foreignKey' => 'user_id',
'associationForeignKey' => 'group_id',
'joinTable' => 'groups_users',
'unique' => true,
)
);
//...snip...
}
class Group extends AppModel {
var $name = 'Group';
var $hasAndBelongsToMany = array ( 'User' => array(
'className' => 'User',
'foreignKey' => 'group_id',
'associationForeignKey' => 'user_id',
'joinTable' => 'groups_users',
'unique' => true,
));
}
我对 HABTM 的理解有误吗?我将如何实现这种多对多关系,我可以使用 CakePHP 查询 groups_users 表,以便返回当前经过身份验证的用户关联的组列表?
更新
应用 ndm 建议的更改后,我仍然会收到一个大数组返回(太大而无法发布),它返回所有组,然后如果用户具有该组的成员身份,则返回一个 'User' 元素。我再次查看了 CakePHP 使用的查询:
SELECT
[User].[id] AS [User__id],
[User].[username] AS [User__username],
[User].[password] AS [User__password],
[User].[email] AS [User__email], CONVERT(VARCHAR(20),
[User].[created], 20) AS [User__created], CONVERT(VARCHAR(20),
[User].[modified], 20) AS [User__modified],
[User].[full_name] AS [User__full_name],
[User].[site] AS [User__site],
[GroupsUser].[user_id] AS [GroupsUser__user_id],
[GroupsUser].[group_id] AS [GroupsUser__group_id],
[GroupsUser].[id] AS [GroupsUser__id]
FROM
[users] AS [User] JOIN
[groups_users] AS [GroupsUser] ON (
[GroupsUser].[group_id] IN (1, 2, 3, 4, 5) AND
[GroupsUser].[user_id] = [User].[id]
)
有没有一种简单的方法来改进它,以便我只收到我拥有成员资格的条目的组 ID 和名称?我正在考虑使用:
array('conditions'=>array('GroupsUser.user_id'=>$user_id))
...但是我在组表上收到一个 sql 错误:
SELECT TOP 1 [Group].[name] AS [Group__name], CONVERT(VARCHAR(20), [Group].[created], 20) AS [Group__created], CONVERT(VARCHAR(20), [Group].[modified], 20) AS [Group__modified], [Group].[id] AS [Group__id] FROM [groups] AS [Group] WHERE [GroupsUser].[user_id] = 36 ORDER BY (SELECT NULL)
【问题讨论】:
-
仅供参考,您只需要 2 行代码(每个模型中一个)是:
public $hasAndBelongsToMany = array('User');和public $hasAndBelongsToMany = array('Group');所有其他代码都是多余的,因为它们已经是默认值。 -
我改变了我的模型。谢谢@Dave
标签: cakephp has-and-belongs-to-many