Как я понял из документации cakephp, одним из преимуществ «сдерживаемого» поведения является возможность получить меньше данных, если вам нужно меньше данных …
Но это, похоже, не работает в моем случае связи между пользователями и группами пользователей.
Мои ассоциации выглядят так:
Group hasMany: Membership User hasMany: Membership Membership belongsTo: User, Group
(Я не использую HABTM, вместо этого использую «Членство» модели между ними, чтобы присоединиться к пользователям и группам).
Все модели реализуют «Containable»-Behavior.
Теперь я хочу получить всех членов группы с определенным идентификатором, только их идентификаторы и почтовые адреса. Мой запрос построен таким образом:
$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' )
Я использую сдерживающее поведение неправильно?
Ваши модели, похоже, вообще не действуют. Вы установили, что ваши модели действуют как сдерживающие?
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 ));
и посмотрите, получите ли вы ожидаемые результаты таким образом.