php – Yii2 – 以一种形式保存多个相关的ActiveRecord模型

这是表结构:

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中的关系函数:

public function getBaseTable()
{
    return $this->hasOne(BaseTable::className(), ['id' => 'id']);
}

在生成的ChildTable形式中,我想更新它的BaseTable的属性描述.这是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是正确的关系名称.相关记录根本不存在(从错误中可以看出它是空的).

它可以是与先前关系的不正确填充相关的错误,也可以是关系.

在后一种情况下,您需要在访问和显示之前检查它是否存在(换句话说为空).

这个:$model-> getBaseTable() – > one()没有任何意义,因为它等于$model-> baseTable.你不应该这样称呼关系.

关于点符号的方式 – 它在这里不起作用.

要加载和保存多个记录,您可以使用:

> loadMultiple()
> validateMultiple()

然后只需在循环中调用save().

上一篇:java基础之I/O操作


下一篇:php – 使用Yii2中的Gii从数据库视图创建CRUD