Yii2 - 从更新表单更新另一个模型的单个字段
Yii2 - Updating single field of another model from update form
StackExchange 的长期被动用户,我在这里不知所措。这可能非常简单,但我被卡住了。我已经使用 gii-enhanced 来构建模型和 CRUD。
我有两个模型:ordenes 和 facturas。
当我更新 facturas 模型时,我可以 link 它已经
现有的 ordenes 模型。
可以将 facturas 模型 linked 为 ordenes 模型。
Ordenes 有一个 amount 字段,facturas 也有。
我目前拥有的:我可以 link 将一个 facturas 模型转换为一个已经存在的 ordenes 模型。一个 facturas 模型只能有一个 ordenes 模型,而一个 ordenes 模型可以有多个 facturas 模型link。
我想要实现的是,当我 link 将 facturas 模型转换为 ordenes 模型时,facturas 模型的数量将从ordenes 模型和新值保存到 ordenes table。所以,如果我已经有一个 ordenes 模型,金额为 200000 美元,并且 link 有一个 facturas 模型金额为 150000 美元,更新后的 ordenes 模型的金额应为 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());
}
}
这只是一个建议
您应该填充模型 Facturas 以检索与此订单相关的 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,
]);
}
}
根据您最后的评论,这可能是对您问题的更准确的回答
假设您的 Orders Model 是 name Orders
在 Facturas 中,您有一个名为 fk_orders 的字段,您可以在其中传递用户在视图中选择的值,并且可以 link 相关订单
然后在 Facturas Controller 中你可以
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,
]);
}
}
StackExchange 的长期被动用户,我在这里不知所措。这可能非常简单,但我被卡住了。我已经使用 gii-enhanced 来构建模型和 CRUD。
我有两个模型:ordenes 和 facturas。
当我更新 facturas 模型时,我可以 link 它已经 现有的 ordenes 模型。
可以将 facturas 模型 linked 为 ordenes 模型。
Ordenes 有一个 amount 字段,facturas 也有。
我目前拥有的:我可以 link 将一个 facturas 模型转换为一个已经存在的 ordenes 模型。一个 facturas 模型只能有一个 ordenes 模型,而一个 ordenes 模型可以有多个 facturas 模型link。
我想要实现的是,当我 link 将 facturas 模型转换为 ordenes 模型时,facturas 模型的数量将从ordenes 模型和新值保存到 ordenes table。所以,如果我已经有一个 ordenes 模型,金额为 200000 美元,并且 link 有一个 facturas 模型金额为 150000 美元,更新后的 ordenes 模型的金额应为 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());
}
}
这只是一个建议
您应该填充模型 Facturas 以检索与此订单相关的 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,
]);
}
}
根据您最后的评论,这可能是对您问题的更准确的回答
假设您的 Orders Model 是 name Orders 在 Facturas 中,您有一个名为 fk_orders 的字段,您可以在其中传递用户在视图中选择的值,并且可以 link 相关订单
然后在 Facturas Controller 中你可以
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,
]);
}
}