2012-04-03 2 views
0

В простом проекте с Yii У меня есть модель:Yii -CExistValidator для внешнего ключа

Checkins.php

* The followings are the available columns in table 'checkins': 
* @property integer $id 
* @property integer $user_id 
* @property integer $item_id 
* @property double $lat 
* @property double $long 

Два значения $ user_id и $ ITEM_ID принадлежат к двум другим таблицам:

public function relations() 
{ 
    // NOTE: you may need to adjust the relation name and the related 
    // class name for the relations automatically generated below. 
    return array(
     'user' => array(self::BELONGS_TO, 'Users', 'user_id'), 
     'item' => array(self::BELONGS_TO, 'Items', 'item_id'), 
    ); 
} 

Я определил некоторые валидатор:

public function rules() 
{ 
    // NOTE: you should only define rules for those attributes that 
    // will receive user inputs. 
    return array(
     array('user_id, item_id, lat, long', 'required'), 

     array('item_id', 'exist', 'on'=>'create', 'attributeName'=>'id', 'className'=>'Items'), 

     array('user_id, item_id', 'numerical', 'integerOnly'=>true), 
     array('lat, long', 'numerical'), 
     // The following rule is used by search(). 
     // Please remove those attributes that should not be searched. 
     array('id, user_id, item_id, lat, long', 'safe', 'on'=>'search'), 


    ); 
} 

Когда в actionCreate метод сохранения() выполнить все валидаторы работают, но не тот, разработанный, чтобы проверить наличие внешнего ключа в модели Items

array('item_id', 'exist', 'on'=>'create', 'attributeName'=>'id', 'className'=>'Items'), 

И в случае, если я пытаюсь спасти возвраты который имеет значение в item_id, не имея одного и того же идентификатора в элементах I, которые не имеют никакой ошибки проверки.

Это правильный подход?

Благодаря

+0

Да, это правильный подход, если вы хотите убедиться, что атрибут item_id должен иметь соответствующий идентификатор в другой таблице. Странно, я пробовал тестировать в своем коде, и он работал нормально. Вы уверены, что не забыли установить сценарий перед сохранением? –

ответ

0

Я думаю, что это скорее всего потому, что вы не установили сценарий в модели, чтобы 'create' перед сохранением (я только предполагаю, что, потому что вы не приложите $checkin->save() кода в диспетчерских actionCreate.). Другая валидация работала, скорее всего, потому, что они не настроены на определенный сценарий (т. Е. Они будут работать во всех валидациях).

Например, если нет товара с идентификатором 5, код ниже

$checkin = new Checkin(); 
    $checkin->text = 'test'; 
    $checkin->item_id = 5; 
    if (!$checkin->validate()){ 
     print_r($checkin->errors); 
    } 

будет работать в обычном режиме, так как Сценарий Checkin «s не установлен в 'create' (по умолчанию 'insert'). Но я пробовал код ниже

$checkin = new Checkin(); 
    $checkin->scenario = 'create'; 
    //or you can set it in the instantiation 
    //$checkin = new Checkin('create'); 
    $checkin->text = 'test'; 
    $checkin->item_id = 5; 
    if (!$checkin->validate()){ 
     print_r($checkin->errors); 
    } 

Это приведет к ошибке проверки.

Можете ли вы вставить свой код сохранения модели?

+0

Петра, спасибо за ваш ответ. Да, сейчас он работает. Мне не было ясно, что сценарий в actionCreate() не «создает», если вы не устанавливаете его с помощью $ checkin-> scene = 'create'; Еще раз спасибо! – maxdangelo

+0

Добро пожаловать. Не забывайте отмечать вопрос как «отвечающий». –