php model->save() 在 Yii2 中不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33759514/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 23:37:09  来源:igfitidea点击:

model->save() Not Working In Yii2

phpyii2yii2-basic-appyii2-model

提问by Nana Partykar

Previously, I was not using $model->save()function for inserting or updating any data. I was simply using createCommand()to execute query and it was working successfully. But, my team members asked me to avoid createCommand()and use $model->save();

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

Now, I started cleaning my code and problem is $model->save();not working for me. I don't know where i did mistake.

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

UsersController.php(Controller)

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");
        }

      }

    } 
    }
    .
    .
}

Everything OK in this except $model->save();Not printing 'asd'as i echoed it.

除了我回应的$model->save();不打印“asd”之外,一切都很好。

And, if i write

而且,如果我写

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

}

It's not entering to this ifcondition.

不进入这个if状态。

And, if i write

而且,如果我写

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

It insert NULL to all columns and print 'asd'

它向所有列插入 NULL 并打印“asd”

Users.php(model)

Users.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);
  }

}

Any help is appreciable. Please Help me.

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

回答by scaisEdge

It could be a problem related with your validation rules.

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

Try, as a test, to save the model without any validation in this way:

作为测试,尝试以这种方式保存模型而不进行任何验证:

$model->save(false);

If the model is saved you have conflict with your validation rules. Try selectively removing your validation rule(s) to find the validation conflict.

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

If you have redefined the value present in active record you don't assign the value to the var for db but for this new var and then are not save.

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

Try removing the duplicated var.. (only the vars non mapped to db should be declared here.)

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

回答by Pavle Li

I guess $model->load()returns false, call $model->errorsto see model's error.

我想$model->load()返回false,调用$model->errors以查看模型的错误。

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

回答by David

As @scaisEdge suggest, try removing all table related field in your Usersclass

正如@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';
  }

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

}

回答by Ruslan Novikov

Check model saving error like this :

检查模型保存错误,如下所示:

if ($model->save()) {

} else {
  echo "MODEL NOT SAVED";
  print_r($model->getAttributes());
  print_r($model->getErrors());
  exit;
}

回答by Devang

The other solution mentioned $model->save(false);. That is just a temporary workaround, and you should still find the actual reason why the save functionality is not working.

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

Here are additional steps to help diagnose the actual issue:

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

  1. check that _forminput field has the proper name, and
  2. check that if you have added any dropdown functionality, then check whether it's working properly or not
  1. 检查_form输入字段是否具有正确的名称,以及
  2. 检查是否添加了任何下拉功能,然后检查它是否正常工作

回答by Nuriddin Rashidov

You are doing all staff correct. I think u must add one line for confirm password validation

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

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;

And Also after this condition check model attributes and error like this :

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

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

回答by kaizer

Try this:

尝试这个:

$model->save(false);

and if thats working, check your model rules() and your form rules() if its having the same rules. usually the cause is the required fields in your table.

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

回答by Mahmut Ayd?n

if your column type in your table is "integer" and your data is "string" you may see tis error.You should check your data type and try again.

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

I suppose that your column type is integer, you should write the following code:

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

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

but your column type is string, you should write the following code:

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

$model->created_at=date('d/m/Y');//11/07/2017
$model->save(); 

回答by stakavi

And there maybe another reason of not saving model - you have property of your Users class and before saving from form its reset to NULL.

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

So, if you set $model->saveAttributes('favorite_book'=>$model->favorite_book), but at that time you declared in class Users public $favorite_book - you will get this field empty in DB.

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

回答by Amitesh Kumar

in your model i found First name , last name , email , password is required fields and in your controller you are updating or saving only

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

 $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;

but first name and last name and email id are required so it will throw validation error , to check this error use

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

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

it will show you the error . correct that errors then model will get save. you can solve that error using Scenario or

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

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

I hope it will help you.

我希望它会帮助你。