17

以前,我没有使用$model->save()函数来插入或更新任何数据。我只是createCommand()用来执行查询,它工作成功。但是,我的团队成员要求我避免createCommand()和使用$model->save();

现在,我开始清理我的代码,但问题$model->save();对我不起作用。我不知道我在哪里做错了。

UsersController.php(控制器)

<?php
namespace app\modules\users\controllers;
use Yii;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\swiftmailer\Mailer;
use yii\filters\AccessControl;
use yii\web\Response;
use yii\widgets\ActiveForm;
use app\modules\users\models\Users;
use app\controllers\CommonController;

class UsersController extends CommonController 
{
    .
    .

    public function actionRegister() {
    $model = new Users();

        // For Ajax Email Exist Validation
   if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())){
     Yii::$app->response->format = Response::FORMAT_JSON;
     return ActiveForm::validate($model);
   } 

   else if ($model->load(Yii::$app->request->post())) {
      $post = Yii::$app->request->post('Users');
      $CheckExistingUser = $model->findOne(['email' => $post['email']]);

      // Ok. Email Doesn't Exist
      if(!$CheckExistingUser) {

        $auth_key = $model->getConfirmationLink();
        $password = md5($post['password']);
        $registration_ip = Yii::$app->getRequest()->getUserIP();
        $created_at = date('Y-m-d h:i:s');

        $model->auth_key = $auth_key;
        $model->password = $password;
        $model->registration_ip = $registration_ip;
        $model->created_at = $created_at;

        if($model->save()) {
          print_r("asd");
        }

      }

    } 
    }
    .
    .
}

$model->save();除了没有打印“asd”之外,一切都很好,因为我回应了它。

而且,如果我写

else if ($model->load(Yii::$app->request->post() && $model->validate()) {

}

它没有进入这种if状态。

而且,如果我写

if($model->save(false)) {
    print_r("asd");
}

它将NULL插入所有列并打印'asd'

用户.php(模型)

<?php

namespace app\modules\users\models;

use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;
use yii\helpers\Security;
use yii\web\IdentityInterface;
use app\modules\users\models\UserType;

class Users extends ActiveRecord implements IdentityInterface 
{

  public $id;
  public $first_name;
  public $last_name;
  public $email;
  public $password;
  public $rememberMe;
  public $confirm_password;
  public $user_type;
  public $company_name;
  public $status;
  public $auth_key;
  public $confirmed_at;
  public $registration_ip;
  public $verify_code;
  public $created_at;
  public $updated_at;
  public $_user = false;

  public static function tableName() {
    return 'users';
  }

  public function rules() {
    return [
      //First Name
      'FirstNameLength' => ['first_name', 'string', 'min' => 3, 'max' => 255],
      'FirstNameTrim' => ['first_name', 'filter', 'filter' => 'trim'],
      'FirstNameRequired' => ['first_name', 'required'],
      //Last Name
      'LastNameLength' => ['last_name', 'string', 'min' => 3, 'max' => 255],
      'LastNameTrim' => ['last_name', 'filter', 'filter' => 'trim'],
      'LastNameRequired' => ['last_name', 'required'],
      //Email ID
      'emailTrim' => ['email', 'filter', 'filter' => 'trim'],
      'emailRequired' => ['email', 'required'],
      'emailPattern' => ['email', 'email'],
      'emailUnique' => ['email', 'unique', 'message' => 'Email already exists!'],
      //Password
      'passwordRequired' => ['password', 'required'],
      'passwordLength' => ['password', 'string', 'min' => 6],
      //Confirm Password
      'ConfirmPasswordRequired' => ['confirm_password', 'required'],
      'ConfirmPasswordLength' => ['confirm_password', 'string', 'min' => 6],
      ['confirm_password', 'compare', 'compareAttribute' => 'password'],
      //Admin Type
      ['user_type', 'required'],
      //company_name
      ['company_name', 'required', 'when' => function($model) {
          return ($model->user_type == 2 ? true : false);
        }, 'whenClient' => "function (attribute, value) {
          return $('input[type=\"radio\"][name=\"Users[user_type]\"]:checked').val() == 2;
      }"], #'enableClientValidation' => false
      //Captcha
      ['verify_code', 'captcha'],

      [['auth_key','registration_ip','created_at'],'safe'] 
    ];
  }

  public function attributeLabels() {
    return [
      'id' => 'ID',
      'first_name' => 'First Name',
      'last_name' => 'Last Name',
      'email' => 'Email',
      'password' => 'Password',
      'user_type' => 'User Type',
      'company_name' => 'Company Name',
      'status' => 'Status',
      'auth_key' => 'Auth Key',
      'confirmed_at' => 'Confirmed At',
      'registration_ip' => 'Registration Ip',
      'confirm_id' => 'Confirm ID',
      'created_at' => 'Created At',
      'updated_at' => 'Updated At',
      'verify_code' => 'Verification Code',
    ];
  }

  //custom methods
  public static function findIdentity($id) {
    return static::findOne($id);
  }

  public static function instantiate($row) {
    return new static($row);
  }

  public static function findIdentityByAccessToken($token, $type = null) {
    throw new NotSupportedException('Method "' . __CLASS__ . '::' . __METHOD__ . '" is not implemented.');
  }

  public function getId() {
    return $this->id;
  }

  public function getAuthKey() {
    return $this->auth_key;
  }

  public function validateAuthKey($authKey) {
    return $this->auth_key === $auth_key;
  }

  public function validatePassword($password) {
    return $this->password === $password;
  }

  public function getFirstName() {
    return $this->first_name;
  }

  public function getLastName() {
    return $this->last_name;
  }

  public function getEmail() {
    return $this->email;
  }

  public function getCompanyName() {
    return $this->company_name;
  }

  public function getUserType() {
    return $this->user_type;
  }

  public function getStatus() {
    return $this->status;
  }

  public function getUserTypeValue() {
    $UserType = $this->user_type;
    $UserTypeValue = UserType::find()->select(['type'])->where(['id' => $UserType])->one();
    return $UserTypeValue['type'];
  }

  public function getCreatedAtDate() {
    $CreatedAtDate = $this->created_at;
    $CreatedAtDate = date('d-m-Y h:i:s A', strtotime($CreatedAtDate));
    return $CreatedAtDate;
  }

  public function getLastUpdatedDate() {
    $UpdatedDate = $this->updated_at;
    if ($UpdatedDate != 0) {
      $UpdatedDate = date('d-m-Y h:i:s A', strtotime($UpdatedDate));
      return $UpdatedDate;
    } else {
      return '';
    }
  }

  public function register() {
    if ($this->validate()) {
      return true;
    }
    return false;
  }

  public static function findByEmailAndPassword($email, $password) {
    $password = md5($password);
    $model = Yii::$app->db->createCommand("SELECT * FROM users WHERE email ='{$email}' AND password='{$password}' AND status=1");
    $users = $model->queryOne();
    if (!empty($users)) {
      return new Users($users);
    } else {
      return false;
    }
  }

  public static function getConfirmationLink() {
    $characters = 'abcedefghijklmnopqrstuvwxyzzyxwvutsrqponmlk';
    $confirmLinkID = '';
    for ($i = 0; $i < 10; $i++) {
      $confirmLinkID .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $confirmLinkID = md5($confirmLinkID);
  }

}

任何帮助都是可观的。请帮我。

4

10 回答 10

48

这可能是与您的验证规则有关的问题。

作为测试,尝试以这种方式在不进行任何验证的情况下保存模型:

$model->save(false);

如果模型已保存,则您的验证规则有冲突。尝试有选择地删除您的验证规则以查找验证冲突。

如果您重新定义了活动记录中存在的值,则不会将该值分配给 db 的 var,而是分配给这个新 var,然后不保存。

尝试删除重复的 var .. (此处仅应声明未映射到 db 的 var。)

于 2015-11-17T15:57:31.480 回答
22

我猜$model->load()返回false,打电话$model->errors查看模型的错误。

$model->load();
$model->validate();
var_dump($model->errors);
于 2015-11-18T03:03:04.897 回答
6

像这样检查模型保存错误:

if ($model->save()) {

} else {
  echo "MODEL NOT SAVED";
  print_r($model->getAttributes());
  print_r($model->getErrors());
  exit;
}
于 2019-04-22T10:58:00.367 回答
4

正如@scaisEdge 建议的那样,尝试删除用户类中的所有表相关字段

class Users extends ActiveRecord implements IdentityInterface 
{
  /* removed because this properties is related in a table's field 
  public $first_name;
  public $last_name;
  public $email;
  public $password;
  public $user_type;
  public $company_name;
  public $status;
  public $auth_key;
  public $confirmed_at;
  public $registration_ip;
  public $verify_code;
  public $created_at;
  public $updated_at;
  public $user_type;
  public $company_name;
  public $status;
  public $auth_key;
  public $confirmed_at;
  public $registration_ip;
  public $verify_code;
  public $created_at;
  public $updated_at;
  */

  // this is properties that not related to users table
  public $rememberMe;
  public $confirm_password;
  public $_user = false;

  public static function tableName() {
    return 'users';
  }

 /* ........... */

}
于 2015-11-17T19:02:07.373 回答
1

提到的另一个解决方案$model->save(false);。这只是一种临时解决方法,您仍然应该找到保存功能不起作用的实际原因。

以下是帮助诊断实际问题的其他步骤:

  1. 检查_form输入字段是否具有正确的名称,并且
  2. 检查您是否添加了任何下拉功能,然后检查它是否正常工作
于 2018-04-07T07:31:45.433 回答
1

并且可能还有另一个不保存模型的原因 - 您拥有用户类的属性,并且在从表单保存之前将其重置为 NULL。

因此,如果您设置了 $model->saveAttributes('favorite_book'=>$model->favorite_book),但当时您在类 Users public $favorite_book 中声明 - 您将在 DB 中将此字段设为空。

于 2018-06-05T11:06:01.950 回答
1

你做的所有员工都是正确的。我想你必须添加一行来确认密码验证

if(!$CheckExistingUser) {    
$auth_key = $model->getConfirmationLink();
        $password = md5($post['password']);
        $registration_ip = Yii::$app->getRequest()->getUserIP();
        $created_at = date('Y-m-d h:i:s');

        $model->auth_key = $auth_key;
        $model->password = $password;
        $model->confirm_password= md5($post["confirm_password"]);  /// add  this line
        $model->registration_ip = $registration_ip;
        $model->created_at = $created_at;

并且在此条件之后检查模型属性和错误,如下所示:

if($model->save()) {
          print_r("asd");
        }else{
var_dump($model);exit;}
于 2015-11-17T18:21:48.443 回答
0

尝试这个:

$model->save(false);

如果那有效,请检查您的模型规则()和表单规则()是否具有相同的规则。通常原因是表中的必填字段。

于 2016-11-02T05:28:20.123 回答
0

如果您的表中的列类型是“整数”并且您的数据是“字符串”,您可能会看到 tis 错误。您应该检查您的数据类型并重试。

我假设您的列类型是整数,您应该编写以下代码:

$model->created_at=time();//1499722038
$model->save(); 

但是您的列类型是字符串,您应该编写以下代码:

$model->created_at=date('d/m/Y');//11/07/2017
$model->save(); 
于 2017-07-10T21:37:00.960 回答
-1

在您的模型中,我发现名字、姓氏、电子邮件、密码是必填字段,而在您的控制器中,您只更新或保存

 $model->auth_key = $auth_key;
        $model->password = $password;
        $model->confirm_password= md5($post["confirm_password"]);  /// add  this line
        $model->registration_ip = $registration_ip;
        $model->created_at = $created_at;

但是名字和姓氏和电子邮件ID是必需的,所以它会抛出验证错误,检查这个错误使用

$model->load();
$model->validate();
var_dump($model->errors);

它会告诉你错误。纠正错误,然后模型将被保存。您可以使用 Scenario 或

$model->saveAttributes('favorite_book'=>$model->favorite_book,'favorite_movie'=>$model->favorite_movie);

我希望它会帮助你。

于 2015-11-18T06:18:03.603 回答