Я наткнулся на ту же проблему, но сейчас - 3 года спустя - с CakePHP 2.3 .
Чтобы быть ясно; Group
имеет и принадлежит User
. У меня была такая форма:
// View/Groups/add.ctp
echo $this->Form->input('name');
echo $this->Form->input('User');
С правилом проверки, как в ответе пользователя user448164:
// Model/Group.php
public $validate = array(
'User' => array(
'rule' => array('multiple', array('min' => 1)),
'message' => 'Please select one or more users'
)
);
Это не сработало, после поиска в Google, я нашел этот вопрос, который все еще не мог быть лучшим решением. Затем я попробовал несколько вещей и обнаружил, что это работает нормально:
// View/Groups/add.ctp
echo $this->Form->input('name');
echo $this->Form->input('Group.User');
Слишком простое решение, но пришлось покопаться в нем, чтобы выяснить, как оно работает.
Надеюсь, однажды это кому-нибудь поможет.
Обновление для CakePHP 2.4.x (возможно, также 2.3.x)
Когда я писал этот ответ, я использовал CakePHP 2.3.x. Тогда он отлично работал как для проверки, так и для сохранения данных. Теперь при применении того же кода в новом проекте, используя CakePHP 2.4.x, он больше не работал.
Я создал тестовый пример, используя следующий код:
$data = array(
'User' => array(
'Client' => array(8)
),
);
$this->User->create();
$this->User->saveAll($data);
Моей первой мыслью было: сохранение всех означает сохранение всех «корневых» моделей, что на самом деле имеет для меня смысл. Чтобы сохранить глубже, чем просто «корневые», вам нужно добавить опцию deep
. В итоге я получил следующий код:
$data = array(
'User' => array(
'Client' => array(8)
),
);
$this->User->create();
$this->User->saveAll($data, array('deep' => true));
Работает как шарм! Удачного кодирования. :)
Обновление (2014/03/06)
Снова сталкиваемся с той же проблемой, в данном случае с hasMany
вместо habtm
. Похоже, что он ведет себя так же. Но я снова нашел этот ответ и запутался.
Я бы хотел пояснить, что ключом для ввода Group.User
вместо User
. В противном случае он не будет использовать проверку модели User
.