it-swarm.com.de

model-> save () funktioniert nicht in Yii2

Bisher habe ich die Funktion $model->save() nicht zum Einfügen oder Aktualisieren von Daten verwendet. Ich benutzte einfach createCommand(), um die Abfrage auszuführen, und es funktionierte erfolgreich. Aber meine Teammitglieder haben mich gebeten, createCommand() zu vermeiden und $model->save(); zu verwenden. 

Jetzt habe ich angefangen, meinen Code zu säubern, und das Problem ist, dass $model->save(); für mich nicht funktioniert. Ich weiß nicht, wo ich mich geirrt habe.

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

      }

    } 
    }
    .
    .
}

Alles in Ordnung, außer $model->save(); Nicht gedruckt 'asd' als ich es wiedergegeben habe. 

Und wenn ich schreibe 

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

}

Es geht nicht in diese if-Bedingung. 

Und wenn ich schreibe

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

Es fügt NULL in alle Spalten ein und druckt 'asd'

Users.php (Modell)

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

}

Jede Hilfe ist spürbar. Bitte hilf mir.

7
Nana Partykar

Es könnte ein Problem mit Ihren Validierungsregeln sein.

Versuchen Sie als Test, das Modell auf diese Weise ohne Validierung zu speichern: 

$model->save(false);

Wenn das Modell gespeichert wird, haben Sie einen Konflikt mit Ihren Validierungsregeln. Entfernen Sie Ihre Validierungsregel (n) selektiv, um den Validierungskonflikt zu finden.

Wenn Sie den im aktiven Datensatz vorhandenen Wert neu definiert haben, weisen Sie der Variable nicht den Wert für db zu, sondern diese neue. Sie werden dann nicht gespeichert. 

Versuchen Sie, die duplizierte var .. zu entfernen.

29
scaisEdge

Ich denke, $model->load() gibt false zurück und ruft $model->errors auf, um den Fehler des Modells anzuzeigen.

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

Wenn @scaisEdge vorschlägt, entfernen Sie alle tabellenbezogenen Felder in Ihrer Users -Klasse

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

Überprüfen Sie den Fehler beim Speichern des Modells wie folgt:

if ($model->save()) {

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

Die andere Lösung erwähnte $model->save(false);. Dies ist nur eine vorübergehende Problemumgehung, und Sie sollten immer noch den eigentlichen Grund finden, warum die Speicherfunktion nicht funktioniert.

Hier finden Sie weitere Schritte zur Diagnose des aktuellen Problems:

  1. prüfen Sie, ob das Eingabefeld _form den richtigen Namen hat, und .
  2. Überprüfen Sie, ob Sie Dropdown-Funktionen hinzugefügt haben, und prüfen Sie, ob sie ordnungsgemäß funktionieren oder nicht
1
Devang

Sie machen alle Mitarbeiter richtig. Ich denke, Sie müssen eine Zeile hinzufügen, um die Passwortüberprüfung zu bestätigen 

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;

Und auch nach dieser Bedingung überprüfen Sie Modellattribute und Fehler wie folgt: 

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

Versuche dies:

$model->save(false);

und wenn das funktioniert, überprüfen Sie Ihre Modellregeln () und Ihre Formularregeln (), wenn die gleichen Regeln hat. Die Ursache sind normalerweise die erforderlichen Felder in Ihrer Tabelle.

0
kaizer

Und vielleicht gibt es noch einen weiteren Grund, das Modell nicht zu speichern - Sie haben Eigenschaften Ihrer Benutzerklasse und vor dem Speichern aus dem Formular werden sie auf NULL zurückgesetzt.

Wenn Sie also $ model-> saveAttributes setzen ('favorite_book' => $ model-> favorite_book), aber zu diesem Zeitpunkt in der Klasse Users public $ favorite_book deklariert haben, wird dieses Feld in DB leer sein.

0
stakavi

wenn Ihr Spaltentyp in Ihrer Tabelle "Ganzzahl" ist und Ihre Daten "Zeichenfolge" sind, wird möglicherweise ein tis-Fehler angezeigt.

Ich nehme an, dass Ihr Spaltentyp eine Ganzzahl ist. Sie sollten den folgenden Code schreiben:

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

aber Ihr Spaltentyp ist String, Sie sollten den folgenden Code schreiben:

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