Yii 重複チェック

データを登録する際にユニークなカラム(ログイン名やメールアドレス等)に
重複するデータが入力された時にチェックする処理を実装する

■実装例

・Userモデルのrules()メソッドを修正
・重複チェックするcheckUnique()メソッドを実装
・performAjaxValidation()でAjaxによるチェックを実行するようにする

Userモデルのrules()メソッドを修正

【/protected/models/User.php】ファイルのrules()に追加

	
	public function rules()
	{
		return array(
			//・・・処理
			
			// 重複チェックを定義
			array('login_name', 'checkUnique'),
			array('mail', 'checkUnique'),
			
			//・・・処理
		);
	}
    

重複チェックするcheckUnique()メソッドを実装

【/protected/models/User.php】ファイルのcheckUnique()に追加

	
	private static $_items = array();
	
	/**
	 * データリスト取得
	 **/
	public static function getItems($select = 'name')
	{
		self::loadItems($select);
		return self::$_items;
	}
	
	/**
	 * 指定データ取得
	 **/
	public static function getItem($id, $select = 'name')
	{
		self::loadItems($select);
		return isset(self::$_items[$id]) ? self::$_items[$id]:false;
	}
	
	/**
	 * データ読み込み
	 **/
	private static function loadItems($select = 'name')
	{
		// データ取得
		$models = self::model()->findAll(
			array('select'=>'id,'.$select)
		);
		
		foreach($models as $model)
		{
			self::$_items[$model->id] = $model->$select;
		}
	}
	
	/**
	 * 重複チェック
	 **/
	public function checkUnique($attribute)
	{
		// 重複チェックのパラメータを設定
		if($this->isNewRecord)
		{
			// 新規
			$conditions = array(
				'select'=>'id',
				'condition'=>$attribute.'=:'.$attribute,
				'params'=>array(':'.$attribute=>$this->{$attribute}),
			);
		}
		else
		{
			// 更新
			$conditions = array(
				'select'=>'id',
				'condition'=>$attribute.'!=:'.$attribute.'1 AND '.$attribute.'=:'.$attribute.'2',
				'params'=>array(':'.$attribute.'1'=>self::getItem($this->id, $attribute), ':'.$attribute.'2'=>$this->{$attribute}),
			);
		}
		
		$models = self::find($conditions);
		
		if(is_null($models) === false)
		{
			$this->addError($attribute, '既に登録されています');
		}
	}
    
更新時は元のデータを重複対象から外す処理をいれないと重複判定されるため
重複対象から外す処理を書く必要がある

getItem()メソッドは指定したカラムのデータを取得する

performAjaxValidation()でAjaxによるチェックを実行するようにする

【/protected/controllers/userController.php】ファイルと【/protected/views/user/_form.php】で
Ajaxによるバリデーションを”actionCreate()”メソッドと”actionUpdate()”メソッドに実行するように設定

■userController.phpファイルを修正

	
	public function actionCreate()
	{
		$model = new User;
		
		// 下記を追記
		$this->performAjaxValidation(array($model));
		
		if(isset($_POST['User'], $_POST['UserDetail']))
		
		//・・・処理
	}
	
	public function actionUpdate($id)
	{
		$model = User::model()->findByPk($id);
		
		// 下記を追記
		$this->performAjaxValidation($model);
		
		//・・・処理
	}
	

■_form.phpファイルを修正


<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'user-form',
	'enableAjaxValidation'=>true,
)); ?>

『enableAjaxValidation』パラメータをtrueにする

■実行画面
yii055

Comments are closed.