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 для модели профиля, сгенерированной при выпечке.

Я пробовал разные подходы, но безуспешно:

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

person nomeacuerdo    schedule 27.06.2012    source источник
comment
Можете ли вы опубликовать свои правила проверки для профиля и полученную ошибку SQL?   -  person Poyan    schedule 28.06.2012
comment
Я не понимаю. Проблема связана с вашими правилами проверки или с массивом, который вы передаете в validateAssociated? Вы можете проверить?   -  person swiecki    schedule 29.06.2012
comment
@swiecki Я думаю, что проблема с контроллером, раньше валидация была нарушена, но я исправил правила, и это сработало... но потом перестало работать :-/   -  person nomeacuerdo    schedule 29.06.2012


Ответы (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()) {
    ...
} 
person Poyan    schedule 28.06.2012
comment
Нет, validates() возвращает true :-/ (кстати, я тоже пробовал это) - person nomeacuerdo; 28.06.2012

Незначительная вещь, которую следует помнить, если вы проверяете связанные данные модели. Затем все связанные поля должны содержаться в этом именованном массиве модели.

person Arun Jain    schedule 06.07.2012