Cakephp - 包含(可包含的行为)取得太多

jwu*_*ulf 4 php mysql cakephp containable

正如我从cakephp文档中所理解的那样,'containable'-Behavior的一个优点是,如果你需要更少的数据,它可以获取更少的数据......

但在我的用户和用户组之间的连接中,这似乎不起作用.

我的关联看起来像:

    Group
    hasMany: Membership

    User
    hasMany: Membership

    Membership
    belongsTo: User, Group
Run Code Online (Sandbox Code Playgroud)

(我没有使用HABTM,而是使用两者之间的模型'Membership'来加入用户和组).

所有模型都实现了"可包含"行为.

现在我希望获得具有特定ID的组的所有成员,只有他们的ID和邮件地址.我的查询是这样构建的:

    $members = $this->Membership->find('all', array(
        'conditions'    => array(
                'group_id'      => $id
            ),
        'contain'       => array(
            'User'          => array(
                'fields' => array('id', 'fullName')
            ),
        )
    ));
Run Code Online (Sandbox Code Playgroud)

但结果数组看起来像:

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'
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

所以有更多的字段取出比我想要的更多......(这与我设置'包含'键的方式相同:

    'contain'   => array(
        'User.fullName', 'User.id'
    )
Run Code Online (Sandbox Code Playgroud)

我使用包含行为错了吗?

Nun*_*ser 5

你的模型似乎根本没有表现出来.您是否将模型设置为可包容?

class Post extends AppModel {
    public $actsAs = array('Containable');
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,可能问题在于递归(以避免Group使用查询获取数组).可包含的行为应该自己处理递归级别,但尝试在AppModel上设置它只是为了确定

class AppModel extends Model {
    public $actsAs = array('Containable');
    public $recursive = -1;
Run Code Online (Sandbox Code Playgroud)

你的第一次尝试

    'contain'       => array(
        'User'          => array(
            'fields' => array('id', 'fullName')
        ),
    )
Run Code Online (Sandbox Code Playgroud)

在语法方面看起来不错,所以可能actAs就是这样.

另外,为了调试,请尝试

$this->Membership->contain('User');
$this->Membership->find('all', array(
    'conditions'    => array(
            'group_id'      => $id
        ));
Run Code Online (Sandbox Code Playgroud)

并看看你是否以这种方式获得了预期的结果.