4

正如我从 cakephp 文档中了解到的那样,“可包含”行为的优点之一是,如果您需要更少的数据,则能够获取更少的数据......

但这在我的用户和用户组之间的连接情况下似乎不起作用。

我的关联看起来像:

    Group
    hasMany: Membership

    User
    hasMany: Membership

    Membership
    belongsTo: User, Group

(我没有使用 HABTM,而是在两者之间使用模型“会员”来加入用户和组)。

所有模型都实现了“可包含”行为。

现在我想获取具有某个 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'
    )

我是否使用了可包含的行为错误?

4

1 回答 1

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
        ));

看看你是否能以这种方式得到预期的结果。

于 2013-09-10T17:23:12.590 回答