Validation cakephp在字段上的唯一性验证

Validation cakephp在字段上的唯一性验证,validation,cakephp,Validation,Cakephp,我正在与cakephp合作。我需要在电子邮件字段中添加三个验证。第一次验证(如果未提供电子邮件),第二次验证有效电子邮件地址,第三次验证(如果提供电子邮件地址),则电子邮件地址应是唯一的。因为这是一张报名表 如何在一个字段上添加三个验证我尝试使用以下代码,但它对我不起作用 public $validate = array( 'email' => array( 'email' => array( 'rule' =&

我正在与cakephp合作。我需要在电子邮件字段中添加三个验证。第一次验证(如果未提供电子邮件),第二次验证有效电子邮件地址,第三次验证(如果提供电子邮件地址),则电子邮件地址应是唯一的。因为这是一张报名表

如何在一个字段上添加三个验证我尝试使用以下代码,但它对我不起作用

public $validate = array(
        'email' => array(
            'email' => array(
                'rule' => array('email'),
                'message' => 'Invalid email address',
                'allowEmpty' => false,
                //'required' => false,
                //'last' => false, // Stop validation after this rule
                //'on' => 'create', // Limit validation to 'create' or 'update' operations
            )
        ),
        'email' => array(
                'rule'    => 'isUnique',
                'message' => 'Email already registered'
            ) 
);

您有两个相同的索引“email”,PHP不允许您使用。改为:-

array(
    'email' => array(
        'notEmpty' => array(
            'rule' => 'notEmpty',
            'message' => 'Provide an email address'
        ),
        'validEmailRule' => array(
            'rule' => array('email'),
            'message' => 'Invalid email address'
        ),
        'uniqueEmailRule' => array(
            'rule' => 'isUnique',
            'message' => 'Email already registered'
        )
    )
);

否则,将只使用您的一条规则。

您使用什么版本的Cakephp

因为我认为如果你使用2.3,它应该是:

public $validate = array( 'email' => 'email' );

SQL表中的字段email设置为主键。

从entities表中的cakephp 3.0开始,它应该如下所示

namespace App\Model\Table;

public function validationDefault($validator)
{
$validator
    ->email('email')
    ->add('email', 'email', [
        'rule' => [$this, 'isUnique'],
        'message' => __('Email already registered')
    ])
    ->requirePresence('email', 'create')
    ->notEmpty('email', 'Email is Required', function( $context ){
        if(isset($context['data']['role_id']) && $context['data']['role_id'] != 4){
            return true;
        }
        return false;
    });
 return $validator;
 }
}


function isUnique($email){
$user = $this->find('all')
    ->where([
            'Users.email' => $email,
      ])
    ->first();
    if($user){
        return false;
    }
    return true;
}
它的工作原理类似于“email”=>array('notempty'=>array('rule'=>'notempty','message'=>'Required Field'),'email'=>array('rule'=>'email','message'=>'entervalidemail'),'isUnique'=>数组('rule'=>'isUnique','message'=>'email已经存在'))