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

Yii2检查数据库中是否已经存在电子邮件,yii2,yii2-advanced-app,Yii2,Yii2 Advanced App,我有一个订阅时事通讯表单,如果数据库中已经存在电子邮件,我会尝试显示一条错误消息。以下是订阅服务器模型Subscriber.php中的代码 <?php namespace common\models; use yii\db\ActiveRecord; class Subscriber extends ActiveRecord { public static function tableName() { return 'subscriber';

我有一个订阅时事通讯表单,如果数据库中已经存在电子邮件,我会尝试显示一条错误消息。以下是订阅服务器模型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.'
            ]
        ];
    }
}
?>
查看代码:

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

订阅时事通讯

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

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

除此之外,如果您将其分解,您的
订阅者
AR模型应该能够独立于表单模型运行。在CRUD更新订阅服务器的过程中,表单之外的情况如何。它还需要知道规则:)

您确定要从视图中创建AJAX请求吗?如果你不这样做,而且你没有展示你的观点,那就行不通了。如果是,则返回适当的成功AJAX响应。如果您不使用AJAX,那么您需要设置一条成功的flash消息。

试试这个

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

我想这会对您有所帮助,它会在提交表单后返回
此电子邮件地址已被占用。
消息。是的,您需要实现一个AJAX请求,以便在表单验证期间进行检查。但是,当您单击“提交”时,它仍然会失败。请在控制器中向我们显示您的操作功能。我已尝试过,但它对我无效。如果可能,请更新我的模型代码,如果唯一验证失败,请启用错误消息。使用$form->formName有史以来最差的解决方案。使用$form->id。在这种情况下使用pjax=\正如您所说,我已经删除了SubscribeNewsletterForm模型,现在我只使用一个模型来收集和保存用户输入(Subscriber)。我还添加了操作代码。正在进行保存和其他验证,但仍不显示消息“此电子邮件地址已被占用”。您可以更新我的代码吗?请尝试将
'targetClass'=>'\common\models\Subscriber',
添加回AR模型。我不知道你为什么把它拿走。我不是很肯定,但我认为有必要把AR申报给你。我总是包含它,因为我认为它创建了类的新实例另外,您是否正在从视图中创建AJAX请求?如果你不这样做,它就跑不动了我更新了代码以更好地显示操作。嗨,韦德,谢谢你的回复。我已经添加了视图代码。正如我所说,如果输入框中输入了不正确的电子邮件或什么都没有输入,我可以将电子邮件存储在数据库中,并且我的代码显示错误。只有当我输入表中已存在的相同电子邮件ID时,才会发生任何事情。我只想在客户端显示一个错误“此电子邮件已被接收”。谢谢
<?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.'
            ]
        ];
    }
}
?>
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
    }
}
[['email'], 'unique',
'targetClass' => Suscriber::className(),
'message' => 'This email is already taken']