FormValidator::SimpleでDBに値が存在しないか確認するプラグイン
Class::DBIをつかって値がDBに登録されていないかを確認するValidator。
使い方は、
create table user( id varchar(32) not null primary key, email varchar(120) not null unique );
というテーブルを想定して、idとemailがすでに登録されていないかを確認するには、
FormValidator::Simple->check($q,[ id=>[ 'NOT_BLANK', ['REGEX',qr/^[a-z][a-z0-9]{3,15}$/], ['CDBIUNIQUE','MyApp::M::CDBI::User'] ], email=>[ 'NOT_BLANK', 'EMAIL', ['CDBIUNIQUE','MyApp::M::CDBI::User','email'] ] ]);
Class::DBIクラスの後ろにカラム名をいれると、primary keyではなくそのカラム名で検索して該当するレコードの有無を調べられます。便利。
ソースは以下。
package FormValidator::Simple::Plugin:: CDBIUnique; use strict; use FormValidator::Simple::Exception; use FormValidator::Simple::Constants; our $VERSION = '0.01'; sub CDBIUNIQUE{ my ($self, $params, $args) = @_; if ( scalar(@$args) == 0){ FormValidator::Simple::Exception->throw( qq/validation "CDBIUNIQUE" needs a Class::DBI class./ ); } my @args=@$args; my $cdbi = shift @args; my @ret; eval{ if(@args == 0){ @ret = $cdbi->retrieve($params->[0]); }else{ @ret = $cdbi->search(@args,$params->[0]); } }; FormValidator::Simple::Exception->throw( qq/Error executing $cdbi : $@/ ) if($@); return (@ret > 0) ? FALSE : TRUE; } 1;
もうすこしコードを見直しが必要かなと思うけど便利なのでAge。