Yii2检查数据库中是否已存在电子邮件

时间:2017-04-16 07:18:58

标签: yii2 yii2-advanced-app

我有一个订阅时事通讯表单,如果电子邮件已存在于数据库中,我正在尝试显示错误消息。以下是订阅者模型 Subscriber.php

中的代码
<?php

namespace common\models;

use yii\db\ActiveRecord;

class Subscriber extends ActiveRecord
{
    public static function tableName()
    {
        return 'subscriber';
    }

    public function rules()
    {
        return [
            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            [
                'email', 'unique',        
                'message' => 'This email address has already been taken.'
            ]
        ];
    }
}
?>

控制器操作

 public function actionSubscriber()
    {
        $subscriber_model  = new Subscriber();

        $request = Yii::$app->request;
        if($request->isAjax && $subscriber_model->load($request->post())){
            $subscriber_model->save();
        }
    }

查看代码:

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\helpers\Url;
?>

<h3>Subscribe to Newsletter</h3>
<?php $form = ActiveForm::begin(['id' => $subscriber_model->formName(), 'action' => ['project/subscriber'], 'enableAjaxValidation' => true]); ?>
    <div class="input-group">
        <?= $form->field($subscriber_model, 'email')->textInput()->label(false); ?>                             
        <span class="input-group-btn">
            <?php echo Html::submitButton('Sign Up', ['class' => 'btn btn-primary subscribe-btn']); ?>
        </span>                             
    </div>
<?php ActiveForm::end(); ?>

<?php
$script = <<< JS
    $('#{$subscriber_model->formName()}').on('beforeSubmit', function(e){
        var form = $(this);
        $.post(
            form.attr("action"),
            form.serialize()
        ).done(function(data){      
            form.trigger("reset");
        });
        return false;
    });
JS;
$this->registerJs($script);
?>

当前代码显示“空电子邮件”和“无效电子邮件”消息,但唯一电子邮件的验证失败。请告诉我代码中的问题。

2 个答案:

答案 0 :(得分:0)

您还需要在AR模型上定义规则。你的表单模型有它自己的内置验证,是的..但是,email规则告诉它查看你的AR模型,它没有任何规则。

除此之外,如果你将其分解,你的Subscriber AR模型应该能够独立于Form模型运行。在CRUD中,在表单之外更新订阅者。它也需要知道规则:)

<?php

namespace common\models;

use yii\db\ActiveRecord;

class Subscriber extends ActiveRecord
{
    public static function tableName()
    {
        return '{{%subscriber}}';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            [
                'email', 'unique',
                'targetClass' => '\common\models\Subscriber',         
                'message' => 'This email address has already been taken.'
            ]
        ];
    }
}
?>

{{%subscriber}}用于支持的表前缀。我总是这样替换它们,以防将来我(或某人)添加表格前缀。

如果列名完全相同,则不需要

targetAttribute

修改

重写你的行动:

public function actionSubscriber()
{
    $subscriber_model  = new Subscriber();

    $request = Yii::$app->request;
    if($request->isAjax && $subscriber_model->load($request->post()) && $subscriber_model->validate() && $subscriber_model->save())
    {
        // return something here
    }
}

您确定从视图中创建了AJAX请求吗?如果你没有,那就行不通了,你没有表现出你的观点。如果是,请返回适当的成功AJAX响应。如果您没有使用AJAX,那么您需要设置成功的Flash消息。

答案 1 :(得分:0)

改为尝试

[['email'], 'unique',
'targetClass' => Suscriber::className(),
'message' => 'This email is already taken']