Yii -CExistValidator用于外键

时间:2012-04-03 21:39:00

标签: yii

在一个简单的Yii项目中我有一个模型:

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中时,方法save()执行所有验证器工作但不是设计用于检查模型中是否存在外部键的项目

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

如果我尝试在item_id中保存一个没有相同ID的Checkins,那么我没有任何验证错误。

这是正确的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

我认为这很可能是因为你在保存之前没有将模型的场景设置为'create'(我只是在猜测,因为你没有附上控制器$checkin->save()中的actionCreate代码。)。其他验证最有可能因为它们未设置为特定方案(即它们将在所有验证中起作用)。

例如,如果没有ID为5的项目,则为以下代码

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

将正常工作,因为Checkin的方案未设置为'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);
    }

这将导致验证错误。

您可以粘贴模型保存代码吗?