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/create
和 products/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'],
在现有项目中有一个 table 包含 3 个字段(ID、名称、标签)
`id` int(11) NOT NULL,
`name` varchar(32) DEFAULT NULL,
`label` varchar(1) DEFAULT 'A'
目前,在 products/create
和 products/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'],