Yii2 在表单中添加一个额外的字段以添加到数据库

Yii2 adding an extra field to the form to add to database

在现有项目中有一个 table 包含 3 个字段(ID、名称、标签)

`id` int(11) NOT NULL,
`name` varchar(32) DEFAULT NULL,
`label` varchar(1) DEFAULT 'A'

目前,在 products/createproducts/update 页面上有一个表单只有一个字段用于 'name'。我需要添加另一个字段 'label'.

更新前,models/Products.php有这个代码:

class Products extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'products';
    }
    
    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['name'], 'string', 'max' => 32],
            [['name'], 'unique'],
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'name' => Yii::t('app', 'Name'),
        ];
    }
}

我在上面的文件中添加了以下内容,但是页面上的表单没有添加新的输入字段:

public function attributeLabels()
{
    return [
        'id' => Yii::t('app', 'ID'),
        'name' => Yii::t('app', 'Name'),
        'label' => Yii::t('app', 'Prefix'),
    ];
}

我也试过像这样添加规则,但是不开心

public function rules()
{
    return [
        [['name', 'label'], 'string', 'max' => 32],
        [['name', 'label'], 'unique'],
    ];
}

您需要将字段添加到 HTML 表单。

如果您打开文件 products/views/_form,您将看到以下行:

<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>

您需要为标签属性添加一个新字段,Yii 将使用模型中的规则和标签为属性生成字段,添加新行:

<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'label')->textInput(['maxlength' => true]) ?>

鉴于您的 table 字段:

`id` int(11) NOT NULL,
`name` varchar(32) DEFAULT NULL,
`label` varchar(1) DEFAULT 'A'

您可能想将规则更新到这个,而不是您显示的规则:

public function rules()
{
    return [
        [['name',], 'string', 'max' => 32],
        [['label',], 'string', 'max' => 1],
        [['name',], 'unique'],
        // Do not make label unique.
        // [['name', 'label'], 'unique'],
    ];
}

label 在数据库上的最大长度为 1,如果你在 ActiveRecord 上给它最大长度 32,它会让用户输入超过 1 个字节的值,它会尝试插入将该值存入数据库,将抛出异常。

如果您使 label 唯一,因为它的最大长度为 1,这将限制 table 可以保存的最大记录数为 256。您将无法要重复使用任何标签,例如,不能有两条标记为“A”的记录,因为这是该列的默认值,如果您已经有一条标记为“A”的记录并且您尝试插入一条新记录离开label字段为空,也会导致异常。

如果保留 unique:

,您可能需要考虑添加 required 规则
[['label',], 'required'],