model->save() Not Working In Yii2

73,295

Solution 1

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.

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

Solution 2

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

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

Solution 3

Check model saving error like this :

if ($model->save()) {

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

Solution 4

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

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';
  }

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

}

Solution 5

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.

Here are additional steps to help diagnose the actual issue:

  1. check that _form input 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
Share:
73,295
Nana Partykar
Author by

Nana Partykar

A Fan Account. Dedicated To Legendary Nana Patekar SoReadyToHelp "A Silent Toilet Leak Could Waste From 30 To 500 Gallons/Day!" ~ Save Water. Save Lives.

Updated on August 23, 2022

Comments

  • Nana Partykar
    Nana Partykar over 1 year

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

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

    UsersController.php (Controller)

    <?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.

    And, if i write

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

    It's not entering to this if condition.

    And, if i write

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

    It insert NULL to all columns and print 'asd'

    Users.php (model)

    <?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.

  • Nana Partykar
    Nana Partykar over 8 years
    Hi Mr Scais. When i use $model->save(false);. NULL is getting inserted to table.
  • Nana Partykar
    Nana Partykar over 8 years
    I Updated my question with Model Mr @Scais.
  • ScaisEdge
    ScaisEdge over 8 years
    But you have redifined the value present in active record... I have update the answer... You are not using insert anymore.. you are using active record
  • Nana Partykar
    Nana Partykar over 8 years
    Sorry @Scais. I didn't get. Really Sorry.
  • ScaisEdge
    ScaisEdge over 8 years
    You do not have to be sorry this is a mistake that I have made several times ... The important thing is that the answer is correct and that your programs to operate it properly
  • Nana Partykar
    Nana Partykar over 8 years
    Ok @Scais. If you don't mind, Can you point out the changes i need to do in my Users.php Model. If possible, can you give One example.
  • ScaisEdge
    ScaisEdge over 8 years
    Is easy simply remove Or comment) the vars with same name of the column table of your user table... You can do it progressively if you want test....
  • Nana Partykar
    Nana Partykar over 8 years
    Hi @Nuriddin. Glad to see you bro. No insertion in table. Help me man. Past 6 Hours, I have been stuck to it.
  • Nuriddin Rashidov
    Nuriddin Rashidov over 8 years
    Hi @Partykar Are u test my answer
  • Nana Partykar
    Nana Partykar over 8 years
    Yeah. I did. Even, i add captcha to it. But, no result man. Now, my brain also stopped working. One more answer @Scais Has given above, but i'm not able to understand what he is saying. Do something @nuriddin.
  • Nuriddin Rashidov
    Nuriddin Rashidov over 8 years
    Can u post the result of this : if($model->save() )-> see my post :-> var_dump($model);
  • Nana Partykar
    Nana Partykar over 8 years
    It printed lot of things @nuriddin. ["id"]=> NULL ["first_name"]=> string(6) "danish" ["last_name"]=> string(4) "enam" ["email"]=> string(14) "[email protected]" ["password"]=> string(32) "e10adc3949ba59abbe56e057f20f883e" ["rememberMe"]=> NULL ["confirm_password"]=> string(6) "123456" ["user_type"]=> string(1) "1" ["company_name"]=> string(0) "" ["status"]=> NULL ["auth_key"]=> string(32) "5276a550bf50d7bdd2067a63c32e0daf" ["confirmed_at"]=> NULL Thses are the first few lines
  • Nuriddin Rashidov
    Nuriddin Rashidov over 8 years
    Can you do this, i think you confirm_password and password not equal to each other because of md5, pls try $model->confirm_password= md5($post["confirm_password"]); for test reason. If it is work, we can do this yii2 way ;)
  • Nana Partykar
    Nana Partykar over 8 years
  • Nana Partykar
    Nana Partykar over 8 years
    Thanks For Answering.
  • ScaisEdge
    ScaisEdge over 8 years
    This wan not an easy answer. I hoped it was also accepted as well as helpful
  • Nana Partykar
    Nana Partykar over 8 years
    Yeah @Scais. From Yesterday I was banging my head. Now issue is resolved. And, at last your suggestion/answer came into existence. Thank You so much for spending time. It is always an honour to get answer/comment from you.
  • ScaisEdge
    ScaisEdge over 8 years
    I have see you take the wrong road but i not insisted in my answer. (I know by my personal experience was right). I have hoped you return to my suggestion. The knowledge in our fields is a precoius stuff. Good Work and thanks..
  • David
    David over 8 years
    did it help you? cause i can't think of any other suggestion
  • Nuriddin Rashidov
    Nuriddin Rashidov over 8 years
    Hi @NanaPartykar, thanks for remembering me my friend. These day i was busy with my new projects and is going great. How about you?