4

cakephp-documentation から理解したように、「containable」動作の利点の 1 つは、必要なデータが少ない場合に、より少ないデータを取得できることです...

しかし、ユーザーとユーザーグループ間の接続の場合、それはうまくいかないようです。

私の関連付けは次のようになります。

    Group
    hasMany: Membership

    User
    hasMany: Membership

    Membership
    belongsTo: User, Group

(私は HABTM を使用していません。代わりにモデル「メンバーシップ」を間に使用して、ユーザーとグループに参加します)。

すべてのモデルは、'Containable'-Behavior を実装しています。

今、特定の 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'
    )

私はcontainable-behaviorを間違って使用していますか?

4

1 に答える 1

5

あなたのモデルはまったく封じ込められているようには見えません。モデルを収容可能として機能するように設定しましたか?

class Post extends AppModel {
    public $actsAs = array('Containable');
}

もしそうなら、多分問題は再帰にあります(Groupクエリで配列を取得しないようにするため)。Containable 動作は再帰レベルを独自に処理する必要がありますが、念のため 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 に答える