正如我从cakephp文档中所理解的那样,'containable'-Behavior的一个优点是,如果你需要更少的数据,它能够获取更少的数据......
但在我的用户和用户组之间的连接中,这似乎不起作用。
我的关联看起来像:
Group
hasMany: Membership
User
hasMany: Membership
Membership
belongsTo: User, Group
(我没有使用HABTM,而是使用两者之间的模型'Membership'来加入用户和组。)
所有模型都实现'可包含'行为。
现在我希望获得具有特定ID的组的所有成员,只有他们的ID和邮件地址。我的查询构建如下:
$members = $this->Membership->find('all', array(
'conditions' => array(
'group_id' => $id
),
'contain' => array(
'User' => array(
'fields' => array('id', 'fullName')
),
)
));
但结果数组看起来像:
array(
(int) 0 => array(
'Membership' => array(
'id' => '1',
'group_id' => '1',
'user_id' => '1',
'role' => 'member'
),
'Group' => array(
'id' => '1',
'name' => 'Foo Group'
),
'User' => array(
'password' => '*****',
'id' => '1',
'name' => 'Dr. Foo'
'mail' => 'foo@bar.baz',
'role' => 'admin'
)
)
)
所以有更多的字段取出比我想要的更多...(这是同样的事情,顺便说一句,我把'包含'键设置为:
'contain' => array(
'User.fullName', 'User.id'
)
我使用可包含行为是错误的吗?
答案 0 :(得分:5)
你的模特似乎根本没有行动。您是否将模型设置为可包容?
class Post extends AppModel {
public $actsAs = array('Containable');
}
如果是这样,可能问题在于递归(以避免使用查询获取Group
数组)。可包含的行为应该自己处理递归级别,但尝试在AppModel上设置它只是为了确保
class AppModel extends Model {
public $actsAs = array('Containable');
public $recursive = -1;
您的第一次尝试
'contain' => array(
'User' => array(
'fields' => array('id', 'fullName')
),
)
在语法方面看起来不错,所以它可能是actAs
的东西。
另外,为了进行调试,请尝试
$this->Membership->contain('User');
$this->Membership->find('all', array(
'conditions' => array(
'group_id' => $id
));
并查看您是否获得了预期的结果。