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