0

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 の 2 つの値は、他の 2 つのテーブルに属します。

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

そして、アイテムに同じIDを持たずにitem_idに値を持つチェックインを保存しようとすると、検証エラーが発生します。

これは正しいアプローチですか?

ありがとう

4

1 に答える 1

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);
    }

これにより、検証エラーが発生します。

モデル保存コードを貼り付けてもらえますか?

于 2012-04-04T01:26:53.460 に答える