CakePHP Проверка данных из связанной модели в контроллере
Здравствуйте, в основном у меня есть две модели: пользователь и профиль. У каждого пользователя есть один профиль.
Поэтому, когда я отправляю форму, она должна быть подтверждена следующим образом:
/* UsersController.php */
...
if ($this->request -> isPost()) {
$this->loadModel('Profile'); //By some reason I have to use loadModel, even if I include it on App::uses
$this->Profile->set( $this->request->data );
$validates = $this->Profile->validateAssociated($this->request->data['Profile']);
if($validates){
//do kinky stuff
} else {
//cry
}
Я определил $validate
правила для модели профиля, сгенерированной в bake.
Я пробовал разные подходы, но безуспешно:
$this->Profile->set( $this->request->data );
if($this->Profile->validates()){
//do kinky stuff
} else {
//cry
}
Каждый раз, когда он идет прямо и выдает ошибку SQL.
Есть идеи? Я что-то пропустил?
РЕДАКТИРОВАТЬ:
Вот правила проверки (я заново запекла правила, чтобы убедиться, что они были правильно отформатированы):
public $validate = array(
'twitter' => array(
'custom' => array(
'rule' => array('custom','([A-Za-z0-9_]+)'),
'message' => 'Sólo son admitidos letras, números y guiones al piso'
),
),
'facebook_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Ingrese su nombre en Facebook'
),
),
'country_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione un país'
),
),
'state_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione un departamento'
),
),
'city_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione una ciudad'
),
),
'barrio' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Ingrese un barrio'
),
),
'direccion' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Ingrese una dirección'
),
),
'telefono' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Ingrese un teléfono'
),
'numeric' => array(
'rule' => array('numeric'),
'message' => 'Sólo se admiten números.'
),
),
'celular' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Ingrese un celular'
),
'numeric' => array(
'rule' => array('numeric'),
'message' => 'Sólo se admiten números.'
),
),
'nacimiento' => array(
'date' => array(
'rule' => array('date'),
'message' => 'Ingrese una fecha de nacimiento válida.'
),
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Ingrese una fecha de nacimiento.'
),
),
'sexo' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione sexo'
),
),
'estado_civil' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione estado civil'
),
),
'estrato' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione estrato'
),
),
'estudio_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione nivel de estudios'
),
),
'ocupacion_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione ocupación'
),
),
'personas_casa' => array(
'comparison' => array(
'rule' => array('comparison', '>', 0),
'message' => 'Seleccione el número de personas en la casa'
),
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione el número de personas en la casa'
),
),
'referred_by' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione cómo se enteró de la Comunidad Talk'
),
),
'referrer' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Seleccione cómo se enteró de la Comunidad Talk'
),
),
);
И ошибка (которая утверждает, что проверка была пропущена):
Error: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'country_id' cannot be null
SQL Query: INSERT INTO `newTalk`.`profiles` (`user_id`, `twitter`, `facebook_id`, `country_id`, `state_id`, `city_id`, `barrio`, `direccion`, `codigo_postal`, `telefono`, `celular`, `nacimiento`, `sexo`, `estado_civil`, `estrato`, `estudio_id`, `ocupacion_id`, `personas_casa`, `referred_by`, `modified`, `created`) VALUES (2, '', '', NULL, NULL, NULL, '', '', '', '', '', NULL, '0', 0, 0, 0, 0, 0, NULL, '2012-06-28 12:56:07', '2012-06-28 12:56:07')
2 ответа
Я предполагаю, что ваша форма опубликовала данные пользователя и профиля.
Во втором примере вы используете неправильный формат для set().
Форма руководства
<?php
$this->Post->read(null, 1);
$this->Post->set(array(
'title' => 'New title',
'published' => false
));
$this->Post->save();
?>
Вы можете попробовать:
$this->Profile->set($this->request->data["Profile"])
if($this->Profile->validates()) {
...
}
Незначительная вещь, которую нужно помнить, если вы проверяете связанные данные модели. Тогда все связанные поля должны содержать в этой модели именованный массив.