下面是表格结构:

Table BaseTable
    id (primary key) INT
    description VARCHAR(255)

Table ChildTable
    id (primary key)(foreign key reference to BaseTable) INT
    child_property VARCHAR(255)

实际上是数据库表中的继承关系。
然后我使用gii为两者生成具有关系函数的模型,并为childtable生成crud操作。下面是childtable中的relation函数:
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:
我用relation得到了基表模型,代码如下:
<?= $form->field($model->getBaseTable()->one(), 'description')->textInput() ?>

我还是犯了个错误:
Call to a member function formName() on null

想法:
我想我可以创建一个新的viewmodel来映射BaseTableChildTable中的所有属性。但是我想知道是否有一个快速的解决方案来实现基于ActiveRecord生成的代码保存多个相关的gii模型?谢谢!

最佳答案

这是:

<?= $form->field($model->baseTable, 'description')->textInput() ?>

应该有效,因为baseTable是正确的关系名称。相关的记录根本不存在(从错误中可以看到它null)。
它可以是与先前关系的不正确填充有关的错误,也可以是可选的关系。
在后一种情况下,您需要在访问和显示之前检查它是否存在(换句话说是null)。
这:$model->getBaseTable()->one()没有任何意义,因为它等于$model->baseTable。你不应该这样称呼关系。
关于圆点符号的方法,这里不行。
要加载和保存多个记录,可以使用:
loadMultiple()
validateMultiple()
然后在循环中调用save()

09-11 14:10