Yii2 - 以一种形式保存多个相关的 ActiveRecord 模型
Yii2 - Saving multiple related ActiveRecord models in one form
这里是 table 结构:
Table BaseTable
id (primary key) INT
description VARCHAR(255)
Table ChildTable
id (primary key)(foreign key reference to BaseTable) INT
child_property VARCHAR(255)
实际上是数据库中的继承关系table。
然后我使用gii
为两者生成具有关系函数的模型,并为ChildTable 生成CRUD 操作。这是 ChildTable 中的关系函数:
public function getBaseTable()
{
return $this->hasOne(BaseTable::className(), ['id' => 'id']);
}
在生成的 ChildTable 表格中,我想更新它的 BaseTable 的 属性 description
。这是 ChildTable 的原始形式:
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'child_property')->textInput() ?>
<?php ActiveForm::end(); ?>
尝试 1:
我在下面添加代码字段:
<?= $form->field($model, 'baseTable.description')->textInput() ?>
我收到这个错误:
Getting unknown property: app\models\ChildTable::baseTable.description
尝试 2:
我下面的广告代码字段:
<?= $form->field($model->baseTable, 'description')->textInput() ?>
我遇到另一个错误:
Call to a member function formName() on null
尝试 3:
我使用关系获取BaseTable模型,代码如下:
<?= $form->field($model->getBaseTable()->one(), 'description')->textInput() ?>
我仍然遇到错误:
Call to a member function formName() on null
想法:
我想到可以创建一个新的 viewModel 来映射 BaseTable
和 ChildTable
中的所有 属性。但是我想知道是否有一种快速的解决方案可以根据gii
生成的代码实现保存多个相关ActiveRecord
模型?谢谢!
这个:
<?= $form->field($model->baseTable, 'description')->textInput() ?>
应该可以工作,因为 baseTable
是正确的关系名称。相关记录根本不存在(如您从错误中看到的那样,它是 null
)。
可能是之前关系填写不正确导致的错误,也可能是关系是可选的。
在后一种情况下,您需要在访问和显示之前检查它是否存在(换句话说是null
)。
这:$model->getBaseTable()->one()
没有任何意义,因为它等于 $model->baseTable
。你不应该这样调用关系。
关于点符号的方式 - 它在这里不起作用。
要加载和保存多条记录,您可以使用:
然后循环调用save()
。
这里是 table 结构:
Table BaseTable
id (primary key) INT
description VARCHAR(255)
Table ChildTable
id (primary key)(foreign key reference to BaseTable) INT
child_property VARCHAR(255)
实际上是数据库中的继承关系table。
然后我使用gii
为两者生成具有关系函数的模型,并为ChildTable 生成CRUD 操作。这是 ChildTable 中的关系函数:
public function getBaseTable()
{
return $this->hasOne(BaseTable::className(), ['id' => 'id']);
}
在生成的 ChildTable 表格中,我想更新它的 BaseTable 的 属性 description
。这是 ChildTable 的原始形式:
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'child_property')->textInput() ?>
<?php ActiveForm::end(); ?>
尝试 1:
我在下面添加代码字段:
<?= $form->field($model, 'baseTable.description')->textInput() ?>
我收到这个错误:
Getting unknown property: app\models\ChildTable::baseTable.description
尝试 2:
我下面的广告代码字段:
<?= $form->field($model->baseTable, 'description')->textInput() ?>
我遇到另一个错误:
Call to a member function formName() on null
尝试 3:
我使用关系获取BaseTable模型,代码如下:
<?= $form->field($model->getBaseTable()->one(), 'description')->textInput() ?>
我仍然遇到错误:
Call to a member function formName() on null
想法:
我想到可以创建一个新的 viewModel 来映射 BaseTable
和 ChildTable
中的所有 属性。但是我想知道是否有一种快速的解决方案可以根据gii
生成的代码实现保存多个相关ActiveRecord
模型?谢谢!
这个:
<?= $form->field($model->baseTable, 'description')->textInput() ?>
应该可以工作,因为 baseTable
是正确的关系名称。相关记录根本不存在(如您从错误中看到的那样,它是 null
)。
可能是之前关系填写不正确导致的错误,也可能是关系是可选的。
在后一种情况下,您需要在访问和显示之前检查它是否存在(换句话说是null
)。
这:$model->getBaseTable()->one()
没有任何意义,因为它等于 $model->baseTable
。你不应该这样调用关系。
关于点符号的方式 - 它在这里不起作用。
要加载和保存多条记录,您可以使用:
然后循环调用save()
。