web-dev-qa-db-fra.com

model-> save () ne fonctionne pas en Yii2

Auparavant, je n'utilisais pas la fonction $model->save() pour insérer ou mettre à jour des données. J'utilisais simplement createCommand() pour exécuter une requête et cela fonctionnait correctement. Mais les membres de mon équipe m'ont demandé d'éviter createCommand() et d'utiliser $model->save();

Maintenant, j'ai commencé à nettoyer mon code et le problème est que $model->save(); ne fonctionne pas pour moi. Je ne sais pas où je me suis trompé.

UsersController.php (Contrôleur)

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

      }

    } 
    }
    .
    .
}

Tout est OK sauf $model->save(); N'imprime pas 'asd' comme je l'ai répété. 

Et si j'écris 

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

}

Cela n'entre pas dans cette condition if

Et si j'écris

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

Il insère NULL dans toutes les colonnes et imprime 'asd'

Users.php (modèle)

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

}

Toute aide est appréciable. Aidez-moi, s'il vous plaît.

7
Nana Partykar

Cela pourrait être un problème lié à vos règles de validation.

Essayez, en guise de test, de sauvegarder le modèle sans aucune validation de la manière suivante: 

$model->save(false);

Si le modèle est enregistré, vous êtes en conflit avec vos règles de validation. Essayez de supprimer sélectivement vos règles de validation pour trouver le conflit de validation.

Si vous avez redéfini la valeur présente dans l'enregistrement actif, vous n'affectez pas la valeur à la var pour la base de données, mais pour cette nouvelle var, vous n'êtes pas enregistré. 

Essayez de supprimer la var dupliquée (seuls les vars non mappés à la base de données doivent être déclarés ici.)

29
scaisEdge

Je suppose que $model->load() renvoie false, appelez $model->errors pour voir l'erreur du modèle.

$model->load();
$model->validate();
var_dump($model->errors);
7
Pavle Li

Comme @scaisEdge le suggère, essayez de supprimer tous les champs liés aux tables de votre Utilisateurs 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';
  }

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

}
3
David

L’autre solution mentionnée $model->save(false);. Il ne s'agit que d'une solution temporaire et vous devez toujours rechercher la raison pour laquelle la fonctionnalité de sauvegarde ne fonctionne pas.

Voici des étapes supplémentaires pour aider à diagnostiquer le problème réel:

  1. vérifie que le champ de saisie _form a le nom correct, et
  2. vérifiez que si vous avez ajouté une fonctionnalité de liste déroulante, puis vérifiez si elle fonctionne correctement ou non
1
Devang

Vous faites tout le personnel correct. Je pense que vous devez ajouter une ligne pour confirmer la validation du mot de passe 

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;

Et aussi après cette condition, vérifiez les attributs du modèle et les erreurs comme ceci: 

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

Essaye ça:

$model->save(false);

et si cela fonctionne, vérifiez vos règles de modèle () et vos règles de formulaire () si ayant les mêmes règles. la cause est généralement les champs obligatoires de votre table.

0
kaizer

Et il y a peut-être une autre raison de ne pas enregistrer le modèle - vous avez la propriété de votre classe Utilisateurs et, avant d’enregistrer du formulaire, sa réinitialisation à NULL.

Donc, si vous définissez $ model-> saveAttributes ('favorite_book' => $ model-> favorite_book), mais que vous avez alors déclaré dans la classe Users public $ favorite_book - vous obtiendrez ce champ vide dans la base de données.

0
stakavi

si votre type de colonne dans votre table est "entier" et que vos données sont "chaîne", vous risquez de voir cette erreur. Vous devez vérifier votre type de données et réessayer.

Je suppose que votre type de colonne est entier, vous devriez écrire le code suivant:

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

mais votre type de colonne est une chaîne, vous devriez écrire le code suivant:

$model->created_at=date('d/m/Y');//11/07/2017
$model->save(); 
0
Mahmut Aydın