2015-09-16 2 views
5

Я не знаю, что не так, но я не могу вставить в базу данных.не может вставить в базу данных в ActiveRecord Yii2

Это то, что я получил в модели.

warranty.php

<?php 

    namespace app\models; 

    use Yii; 
    use yii\db\ActiveRecord; 
    use yii\behaviors\TimestampBehavior; 
    use yii\db\Expression; 
    use yii\helpers\VarDumper; 
    /** 
    * This is the model class for table "warrantytwo". 
    * 
    * @property integer $id 
    * @property string $item_no 
    * @property string $warranty_date 
    * @property string $date 
    * @property integer $created_by 
    * @property string $tstamp 
    */ 
    class Warrantytwo extends ActiveRecord 
    { 
     /** 
     * @inheritdoc 
     */ 
     public static function tableName() 
     { 
      return 'warrantytwo'; 
     } 

     public function behaviors() 
     { 
      return [ 
       [ 
        'class' => TimestampBehavior::className(), 
        'createdAtAttribute' => 'tstamp', 
        'updatedAtAttribute' => false, 
        'value' => new Expression('NOW()'), 
       ], 
      ]; 
     } 

     /** 
     * @inheritdoc 
     */ 
     public function rules() 
     { 
      return [ 
       [['item_no', 'warranty_date'], 'required'], 

       [['warranty_date', 'date'], 'string'], 

       ['created_by', 'default', 'value' => 'none'], 

       [['created_by'], 'integer'], 

       [['warranty_date', 'date','tstamp'], 'safe'], 

       [['item_no'], 'string', 'max' => 100] 
      ]; 
     } 

     /** 
     * @inheritdoc 
     */ 
     public function attributeLabels() 
     { 
      return [ 
       'id' => 'ID', 
       'item_no' => 'Item No.', 
       'warranty_date' => 'Warranty Date', 
       'date' => 'Date', 
       'created_by' => 'Created By', 
       'tstamp' => 'tstamp', 
      ]; 
     } 

     public function addWarrantytwo() 
     { 
      if ($this->validate()) { 
       $Warrantytwo = new Warrantytwo(); 
       $Warrantytwo->item_no = $this->item_no; 
       $Warrantytwo->warranty_date = $this->warranty_date; 
       $Warrantytwo->created_by = 'admin1'; 
       $Warrantytwo->date = date('Y-m-d H:i:s'); 
       //$Warrantytwo->touch('tstamp'); 

       if ($Warrantytwo->save()) 
       { 
        return $Warrantytwo; 
       }else { 
        VarDumper::dump($Warrantytwo->getErrors()); 
       } 
      } 

      //return null; 
     } 
    } 

controller.php

public function actionWarranty() 
    { 
     //$model= new WarrantyDate(); 
     $model= new Warrantytwo(); 

     if ($model->load(Yii::$app->request->post()) && $model->addWarrantytwo()) { 
      return $this->redirect(['warranty']); 
     } 
     else { 
     return $this->render('warranty', [ 
      'model' => $model, 
      ]); 
     } 
    } 

и в моих взглядах/форма

<?php $form = ActiveForm::begin([ 
     'id' => 'new-warranty-form', 
     //'options' => ['class' => 'form-horizontal'], //for yii\ActiveForm 
     'type' => ActiveForm::TYPE_HORIZONTAL, //for krajee\ActiveForm 
     'formConfig' => ['labelSpan' => 4, 'deviceSize' => ActiveForm::SIZE_SMALL] ]); ?> 
       <div class="form-horizontal"> 

    <?= $form->field($model, 'item_no', 
     ['addon' => ['append' => ['content'=> '<a href="#w" onClick="sample()"><i class="glyphicon glyphicon-search"></i></a>']] ]); ?>       

    <?= $form->field($model, 'warranty_date')-> widget(DatePicker::classname(), 
    [ 
    'options' => ['placeholder' => 'Date Claimed'], 
    'pluginOptions' => [ 'autoclose'=>true ] 
       ]); ?> 

    </div> 
    <div class="col-sm-offset-5 col-md-9"> 

    <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'warranty-button']) ?> 

    <?= Html::resetButton('Reset', ['class' => 'btn btn-default']); ?> 
    </div> 

    <?php ActiveForm::end(); ?> 

Это не дает каких-либо ошибок, но когда я проверить его на в базе данных ничего не добавлено. Надеюсь, кто-нибудь может мне помочь. Спасибо. Я новичок в YII2, поэтому я до сих пор не понимаю.

+0

Можете ли вы рассказать мне о ценности сообщения 'warranty_date'? – GAMITG

+0

@gamitg i значение - это дата, я думаю. Я использовал виджет датпикера kartik. и я также изменил свой тип данных в mysql на 'text' вместо' date', чтобы гарантировать, что дата может быть добавлена ​​в dbase. – BlackSkull

+0

Вы можете попытаться сохранить данные с помощью '$ Warrantytwo-> save (false)'. Это означает, что без проверки можно сохранить данные для поиска проблемы. – GAMITG

ответ

2

Поскольку вы должны определить, в каких ситуациях проблема проходит тест таким образом. (Иногда это создает некоторую путаницу, потому что validate() всегда возвращает что-то)

public function addWarrantytwo() 
    { 
     if ($this->validate()) { 
      $Warrantytwo = new Warrantytwo(); 
      $Warrantytwo->item_no = $this->item_no; 
      $Warrantytwo->warranty_date = $this->warranty_date; 
      $Warrantytwo->created_by = 'admin1'; 
      $Warrantytwo->date = date('Y-m-d H:i:s'); 
      //$Warrantytwo->touch('tstamp'); 

      if ($Warrantytwo->save(false)) // try save without validation 
      { 
       return $Warrantytwo; 
      }else { 
       VarDumper::dump($Warrantytwo->getErrors()); 
       exit; 
      } 
     } 
     else { 
      VarDumper::dump($this->validate()); // check for the correct flow 
      exit; 
     } 

     //return null; 
    } 
+0

привет, сэр. Я попробовал ваш ответ, после подачи формы я получаю только «ложное» слово. где, по вашему мнению, была ошибка? Спасибо за твой ответ. :) – BlackSkull

+1

Затем подтверждение возвращает false. для того, чтобы найти erro rtry, комментируя выборочно ваши правила. Это поможет вам определить причину ошибки проверки. '[['warranty_date', 'date'], 'string'], строка даты странная. – scaisEdge

+0

Я думаю, что знаю, где ошибка. это тип данных созданного_by. Но я проголосую за ваш вопрос, потому что мне полезно найти, где произошла ошибка. Спасибо! – BlackSkull