取决于这个问题:Yii2 updating two related models does not show data of the second。我已经将相关模型InvoiceItems
调用到它有多种关系的Invoices
模型。
但是,更新会导致在invoice_items
表中插入新记录,而不是将当前相关记录更新到invoices
表。
我尝试在id
视图中添加每个InvoiceItems
记录的_form
字段来解决此问题,但它仍然存在。
以下是actionUpdate
的{{1}}:
InvoicesController
这是public function actionUpdate($id)
{
$model = $this->findModel($id);
//$invoiceItems = new InvoiceItems();
$count = count(Yii::$app->request->post('InvoiceItems', []));
//Send at least one model to the form
$invoiceItems = [new InvoiceItems()];
//Create an array of the products submitted
for($i = 1; $i < $count; $i++) {
$invoiceItems[] = new InvoiceItems();
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
//$invoiceItems->invoice_id = $model->id;
if (Model::loadMultiple($invoiceItems, Yii::$app->request->post())){
foreach ($invoiceItems as $item){
$item->invoice_id = $model->id;
//$item->id = $model->invoiceItems->id;
$item->save(false);
}
return $this->redirect(['view', 'id' => $model->id]);
}
else{
return var_dump($invoiceItems);
}
} else {
//$invoiceItems->invoice_id = $model->id;
$invoiceItems = $this->findInvoiceItemsModel($model->id);
return $this->render('update', [
'model' => $model,
'invoiceItems' => $invoiceItems,
]);
}
}
的{{1}}视图代码:
_form
以下屏幕截图,直观地展示了我的所作所为:
答案 0 :(得分:1)
如果您在更新时不需要新记录,则应删除
这部分
$count = count(Yii::$app->request->post('InvoiceItems', []));
//Send at least one model to the form
$invoiceItems = [new InvoiceItems()];
//Create an array of the products submitted
for($i = 1; $i < $count; $i++) {
$invoiceItems[] = new InvoiceItems();
}
以这种方式创建的$ invoiceItems是显而易见的"new"
,然后插入..对于更新,模型必须不是新的..
你已经有相关的模型来保存它们来自post ..和来自加载多个
如果您需要管理新模型(例如:因为您在宽格式更新操作中添加了新记录),您可以测试
$yourModel->isNewRecord
如果这是新的检查,那么如果用户已正确设置相关字段,您可以使用
保存它$yourModel->save();
否则你可以简单地放弃..(不保存)
答案 1 :(得分:0)
我很确定下面这段代码当然会用提交的数据填充一个名为$ invoiceItems的数组。
if (Model::loadMultiple($invoiceItems, Yii::$app->request->post())){
foreach ($invoiceItems as $item){
$item->invoice_id = $model->id;
//$item->id = $model->invoiceItems->id;
$item->save(false);
}
}
但是所有$项目都有“插入”方案(可能是你允许设置属性'ID',但通常在Gii生成的代码中不允许这样做。然后你得到“新项目”保存。
如果您在loadMultiple之后添加return var_dump($invoiceItems);
,则会看到只有safe
属性填充了提交的数据。
在保存之前你也没有验证它们,这也很糟糕。
if (Model::loadMultiple($invoiceItems, Yii::$app->request->post()) && Model::validateMultiple($invoiceItems)) {
http://www.yiiframework.com/doc-2.0/guide-input-tabular-input.html
答案 2 :(得分:0)
根据scaisEdge回答和this widget documentation。我能够确定问题解决方案。
简单地说,在我的代码中,当我说:
时,我忽略了两个模型之间的关系$count = count(Yii::$app->request->post('InvoiceItems', []));
//Send at least one model to the form
$invoiceItems = [new InvoiceItems()];
$invoiceItems
的值应使用如下关系获得:
$invoiceItems = $model->invoiceItems;
但是,在更新期间,我仍然有另一个问题,即在相关模型InvoiceItems
中添加新记录。