Intereting Posts
Nginx + PHP: перенаправить защищенный запрос файла на PHP-скрипт, а затем загрузить файл PHP XPath заканчивается отправлять несколько данных изображения с помощью текстового поля с углового контроллера PHP: json_encode vs serialize для хранения в базе данных MySQL? Сделать cURL записывать данные по мере их получения Неверный запрос при использовании API Gmail Регулярное выражение для сбора всего после последнего / Как отобразить выбранный элемент в раскрывающемся списке? Быстрая загрузка нескольких изображений на сервер Yii с использованием переменной с условием IN Многомерный массив для объекта, особым образом «Безопасный» процессор уценки для PHP? Выделите все элементы в таблице и отобразите их в порядке, в зависимости от их идентификатора родителя Единичное тестирование json-кодирования / декодирования на ошибки Служба проверки URL-адреса для вредоносного ПО или фишинга?

CakePHP – содержит (сдерживаемое поведение) слишком сильно забирает

Как я понял из документации 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 )); 

и посмотрите, получите ли вы ожидаемые результаты таким образом.