2017-03-31 133 views
2

StackExchange的長期被動用戶,我在此處不知所措。這可能超級簡單,但我卡住了。我已經使用gii-enhanced來建立模型和CRUD。Yii2 - 從更新表單更新另一個模型的單個字段

  • 我有兩個模型:ordenes和facturas。

  • 當我更新facturas模型時,我可以將它鏈接到已有的 現有ordenes模型。

  • facturas模型可以鏈接到ordenes模型。

  • Ordenes有數量字段,因此facturas。

我現在有什麼:我可以將facturas模型鏈接到已經存在的ordenes模型。一個facturas模型只能有一個ordenes模型,而ordenes模型可以有多個facturas模型鏈接到它。

我想達成的目標是,當我從facturas模型鏈接facturas模型到模型ordenes量從ordenes模型並保存到新價值的金額中扣除ordenes表。因此,如果我已經有一個金額爲200000美元的ordenes模型,並且鏈接到該模型的金額爲150000美元,則更新的模型應該具有金額50000美元。

相關的代碼在facturasController:

public function actionUpdate($id) 
    { 
     $model = $this->findModel($id); 

     if ($model->loadAll(Yii::$app->request->post()) && $model->saveAll()) { 
      return $this->redirect(['view', 'id' => $model->idfacturas]); 
     } else { 
      return $this->render('update', [ 
       'model' => $model, 
      ]); 
     } 
    } 

視圖中的相關領域:

<?= $form->field($model, 'ordenes_idordenes')->widget(\kartik\widgets\Select2::classname(), [ 
     'data' => \yii\helpers\ArrayHelper::map(\frontend\models\Ordenes::find()->orderBy('idordenes')->asArray()->all(), 'idordenes', 'numero'), 
     'options' => ['placeholder' => Yii::t('app', 'Vincular Orden de Compra')], 
     'pluginOptions' => [ 
      'allowClear' => true 
     ], 
    ]); ?> 

的facturas模型的相關部分:

/** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getOrdenesIdordenes() 
    { 
     return $this->hasOne(\frontend\models\Ordenes::className(), ['idordenes' => 'ordenes_idordenes'])->inverseOf('facturas'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getProveedoresIdproveedores() 
    { 
     return $this->hasOne(\frontend\models\Proveedores::className(), ['idproveedores' => 'proveedores_idproveedores'])->inverseOf('facturas'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    /*public function getUserIduser() 
    { 
     return $this->hasOne(\frontend\models\User::className(), ['id' => 'user_iduser'])->inverseOf('facturas'); 
    }*/ 
    public function getUserIduser() 
    { 
     return $this->hasOne(\backend\models\User::className(), ['id' => 'user_iduser'])->inverseOf('facturas'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getOrdenes() 
    { 
     return $this->hasMany(\frontend\models\Ordenes::className(), ['facturas_idfacturas' => 'idfacturas'])->inverseOf('facturasIdfacturas'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getEstadosContab() 
    { 
     return $this->hasOne(\frontend\models\EstadosContab::className(), ['idcontab' => 'estados_contab'])->inverseOf('facturas'); 
    } 

/** 
    * @inheritdoc 
    * @return array mixed 
    */ 
    public function behaviors() 
    { 
     return [ 
      'blameable' => [ 
       'class' => BlameableBehavior::className(), 
       'createdByAttribute' => 'user_crea', 
       'updatedByAttribute' => 'user_modif', 
      ], 
      'uuid' => [ 
       'class' => UUIDBehavior::className(), 
       'column' => 'idfacturas', 
      ], 
     ]; 
    } 

    /** 
    * @inheritdoc 
    * @return \frontend\models\FacturasQuery the active query used by this AR class. 
    */ 
    public static function find() 
    { 
     return new \frontend\models\FacturasQuery(get_called_class()); 
    } 
} 

和相關的部件Ordenes模型:

/** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getFacturas() 
    { 
     return $this->hasMany(\frontend\models\Facturas::className(), ['ordenes_idordenes' => 'idordenes'])->inverseOf('ordenesIdordenes'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getNotas() 
    { 
     return $this->hasMany(\frontend\models\Notas::className(), ['ordenes_idordenes' => 'idordenes'])->inverseOf('ordenesIdordenes'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getEstado() 
    { 
     return $this->hasOne(\frontend\models\Estados::className(), ['idestados' => 'estado_id'])->inverseOf('ordenes'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getNotasIdnotas() 
    { 
     return $this->hasOne(\frontend\models\Notas::className(), ['idnotas' => 'notas_idnotas'])->inverseOf('ordenes'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getFacturasIdfacturas() 
    { 
     return $this->hasOne(\frontend\models\Facturas::className(), ['idfacturas' => 'facturas_idfacturas'])->inverseOf('ordenes'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getProveedoresIdproveedores() 
    { 
     return $this->hasOne(\frontend\models\Proveedores::className(), ['idproveedores' => 'proveedores_idproveedores'])->inverseOf('ordenes'); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getTipocompra() 
    { 
     return $this->hasOne(\frontend\models\TipoCompra::className(), ['category_id' => 'tipocompra_id'])->inverseOf('ordenes'); 
    } 

/** 
    * @inheritdoc 
    * @return array mixed 
    */ 
    public function behaviors() 
    { 
     return [ 
      'blameable' => [ 
       'class' => BlameableBehavior::className(), 
       'createdByAttribute' => 'created_by', 
       'updatedByAttribute' => 'updated_by', 
      ], 
      'uuid' => [ 
       'class' => UUIDBehavior::className(), 
       'column' => 'idordenes', 
      ], 
     ]; 
    } 

    /** 
    * @inheritdoc 
    * @return \frontend\models\OrdenesQuery the active query used by this AR class. 
    */ 
    public static function find() 
    { 
     return new \frontend\models\OrdenesQuery(get_called_class()); 
    } 
} 

回答

2

這僅僅是一個建議
你應該填充模型Facturas retriving與此相關的訂單facturas然後分配適當的,你需要根據你最後的評論這可以在facturas模型

use common\models\Facturas; 

public function actionUpdate($id) 
    { 
     $model = $this->findModel($id); 


     if ($model->loadAll(Yii::$app->request->post()){ 
      $modelFacturas = Facturas::find() 
      ->(['your_id_fatcuras' => $model->your_id_facturas ])->one(); 
      $modelFacturas->you_field_to_change = $model->value1 - $modelFacturas->value2; 
      $model->save(); 
      $modelFacturas->save(); 

      return $this->redirect(['view', 'id' => $model->idfacturas]); 
     } else { 
      return $this->render('update', [ 
       'model' => $model, 
      ]); 
     } 
    } 

值更準確地回答您的問題

假設您的訂單模型是名稱訂單 並且在Facturas中您有一個名爲fk_orders的字段,您可以在視圖中傳遞用戶選擇的值,並且可以將相關特德在Facturas控制器訂購

然後你就可以

use common\models\Orders; 

public function actionUpdate($id) 
    { 
     $model = $this->findModel($id); // retrive the Factursa model 


     if ($model->loadAll(Yii::$app->request->post()){ 
      $modelOrders = Orders::find() 
      ->(['id_orders' => $model->fk_orders ])->one(); 
      $modelOrders->amount = $modelOrders->amount - $model->value_to_subtract; 
      $model->save(); 
      $modelOrders->save(); 

      return $this->redirect(['view', 'id' => $model->idfacturas]); 
     } else { 
      return $this->render('update', [ 
       'model' => $model, 
      ]); 
     } 
    } 
+0

的事情是,**的** Facturas模型,首次創建時,沒有一個相關的** **的訂單模式。這是用戶更新Facturas模型時創建的關係(通過選擇框)。正是在這一點上,來自Facturas模型的** monto **(金額)應該從**新近相關的** Orders模型的monto中減去。所有來自Facturas模型的更新視圖。 –

+0

那麼主模型是一個Fatcuras模型,並且提交返回也是訂單模型的參考? – scaisEdge

+0

實際上,設置是這樣的:首先,創建一個Ordenes模型。後來Facturas模型也被創建。兩者都有**金額**字段,詳細說明該文件的價值。在某一點上,Facturas模型必須與Ordenes模型相關聯。一個Ordenes模型可以有許多Facturas模型關係,而一個Facturas模型只能有一個Ordenes關係。這個想法是,當Facturas模型通過選擇框鏈接到Ordenes模型時,Facturas和Ordenes模型必須更新,但是在不同的屬性上(Fadeuras的Ordenes FK,Ordenes的數量) –