Cakephp – contener (comportamiento contable) alcanza demasiado

Como entendí de la documentación de cakephp, una de las ventajas del comportamiento ‘con capacidad’ es poder obtener menos datos si necesita menos datos …

Pero eso no parece funcionar en mi caso de una conexión entre usuarios y grupos de usuarios.

Mis asociaciones se ven así:

Group hasMany: Membership User hasMany: Membership Membership belongsTo: User, Group 

(No estoy usando HABTM, sino que utilizo el modelo ‘Membresía’ para unirme a usuarios y grupos).

Todos los Modelos implementan el Comportamiento ‘Containable’.

Ahora quiero obtener todos los miembros de un grupo con cierta identificación, solo sus identificaciones y direcciones de correo. Mi consulta está construida así:

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

Pero la matriz resultante se ve así:

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

Así que definitivamente hay más campos recuperados de lo que quería … (es lo mismo por lo que puse la tecla ‘contener’ para:

  'contain' => array( 'User.fullName', 'User.id' ) 

¿Estoy usando el comportamiento contenible incorrecto?

Sus modelos no parecen estar actuando en absoluto. ¿Has configurado tus modelos para que funcionen como contenibles?

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

Si es así, tal vez el problema sea con la recursión (para evitar obtener la matriz de Group con la consulta). El comportamiento que se puede contener debe manejar el nivel de recursión por sí mismo, pero intente configurarlo en AppModel solo para estar seguro

 class AppModel extends Model { public $actsAs = array('Containable'); public $recursive = -1; 

Tu primer bash

  'contain' => array( 'User' => array( 'fields' => array('id', 'fullName') ), ) 

se ve bien en términos de syntax, por lo que probablemente sea la cosa de las actAs .

Además, para la depuración también, intente

 $this->Membership->contain('User'); $this->Membership->find('all', array( 'conditions' => array( 'group_id' => $id )); 

y mira si obtienes los resultados esperados de esa manera.