2016-09-17 65 views
0

我正在使用Yii2活動記錄事務,但驗證在代碼中間失敗,它仍然提交事務。 請指教。yii2活動記錄事務在驗證失敗時仍然提交

public function actionCreate() 
{ 
    $model = new PoAgen(); 
    $seq = Sequence::FindOne(['seq_id' => 'INV/AG', 'seq_name' => (int)date('ymd')]); 
    if(is_null($seq)) 
    { 
     $_seq = new Sequence(); 
     $_seq->seq_id = 'INV/AG'; 
     $_seq->seq_name = (int)date('ymd'); 
     $_seq->value = 0; 
     $_seq->save(); 
     $model->trx_id = $_seq->seq_id . '/' . $_seq->seq_name . str_pad($_seq->value+1, 3, "0", STR_PAD_LEFT); 
    } 
    else { 
     $seq->value += 1; 
     $model->trx_id = $seq->seq_id . '/' . $seq->seq_name . str_pad($seq->value, 3, "0", STR_PAD_LEFT); 
     $seq->update(); 
    } 

    $model->pot_cong = 0; 
    $model->pot_basah_kg = 0; 
    $model->pot_tangkai = 0; 
    $model->ppn = 0; 
    $model->pot_pinjaman = 0; 
    $model->pot_panjar = 0; 
    $model->ongkos_angkut = 0; 
    $model->pot_angkut = 0; 
    $model->is_transfer = true; 
    $model->buy_date = date('Y-m-d'); 

    if ($model->load(Yii::$app->request->post())) { 
     $transaction = Yii::$app->db->beginTransaction(); 
     try 
     { 
      $model->created_by = Yii::$app->user->identity->id; 
      $model->created_time = date('Y-m-d H:i:s'); 

      $saldo = Saldo::findOne(1); 
      $kas = Kas::findOne(1000); // pembelian agen pks 
      $agen = Agen::findOne($model->agen_id); 

      if(!$model->is_transfer) 
      { 
       if($kas->code == 'D') 
       { 
        $saldo->balance -= $model->total_bayar; 
       } 
       else 
       { 
        $saldo->balance += $model->total_bayar; 
       } 
       $saldo->update(); 
      } 
      $model->save(); 

      // posting to kasbook 
      $kasbook = new KasBook(); 
      $kasbook->kasbook_id = uniqid(); 
      $kasbook->kas_date = $model->buy_date; 
      $kasbook->ref_trxid = $model->trx_id; 
      $kasbook->kas_id = $kas->kas_id; 
      $kasbook->code = $kas->code; 
      $kasbook->total = $model->total_bayar; 
      $kasbook->balance = $saldo->balance; 
      $kasbook->received_by = '['. $model->agen_id . '] ' . $agen->agen_name; 
      $kasbook->remark = 'Berat Bersih : ' . $model->r_bersih . ', Harga : ' . $model->price; 
      $kasbook->vehicle_id = $model->vehicle_id; 
      $kasbook->is_transfer = $model->is_transfer; 
      $kasbook->created_by = Yii::$app->user->identity->id; 
      $kasbook->created_time = date('Y-m-d H:i:s'); 
      $kasbook->save(); 

      if($model->ppn != 0) 
      { 
       $kb_1 = new KasBook(); 
       $kb_1->kasbook_id = uniqid(); 
       $kb_1->kas_date = $model->buy_date; 
       $kb_1->ref_trxid = $model->trx_id; 
       $kb_1->kas_id = 2000; 
       $kb_1->code = 'K'; 
       $kb_1->total = $model->ppn; 
       $kb_1->balance = $saldo->balance; 
       $kb_1->remark = 'Ppn Pembelian Agen'; 
       $kb_1->vehicle_id = $model->vehicle_id; 
       $kb_1->is_transfer = true; 
       $kb_1->created_by = Yii::$app->user->identity->id; 
       $kb_1->created_time = date('Y-m-d H:i:s'); 
       $kb_1->save(); 
      } 

      // kurang posting ke purchase order barang 
      $transaction->commit(); 
      return $this->redirect(['view', 'id' => $model->trx_id]); 
     } 
     catch(Exception $e) {     
      $transaction->rollBack(); 
      throw $e; 
     }    
    } else { 
     return $this->render('create', [ 
      'model' => $model, 
     ]); 
    } 
} 

驗證失敗在if($model->ppn !=0) { ... } 因爲沒有在主表中的任何主鍵,但成交仍然承諾和模型插入到數據庫中。 請指教。以前感謝。

回答

1

save()方法不會拋出異常,但會返回布爾值,所以您需要明確地拋出它。與

if (! ...->save()) { 
    throw new \yii\db\Exception('Error while saving ... model!'); 
    // or use general \Exception() 
} 

所以現在可以抓住每更換

...->save(); 
中的try-catch

+0

感謝交代。 –

0

你可以這樣做:

$flag=true; 
if($model->ppn != 0) 
      { 
       $kb_1 = new KasBook(); 
       $kb_1->kasbook_id = uniqid(); 
       $kb_1->kas_date = $model->buy_date; 
       $kb_1->ref_trxid = $model->trx_id; 
       $kb_1->kas_id = 2000; 
       $kb_1->code = 'K'; 
       $kb_1->total = $model->ppn; 
       $kb_1->balance = $saldo->balance; 
       $kb_1->remark = 'Ppn Pembelian Agen'; 
       $kb_1->vehicle_id = $model->vehicle_id; 
       $kb_1->is_transfer = true; 
       $kb_1->created_by = Yii::$app->user->identity->id; 
       $kb_1->created_time = date('Y-m-d H:i:s'); 
       if(!$kb_1->save()) 
       { 
        $flag=false; 
       } 
      } 
      if($flag) 
       $transaction->commit(); 
      else 
       $transaction->rollback(); 

+0

是的,自從Bizley解釋它以來,我已經做到了。非常感謝 –