我是 yii 框架的新手。我在 yii 框架中创建了一个应用程序。我使用 gii 创建了模型、控制器、视图。之后我更改数据库表。我删除了 2 列并添加了 3 个新列。之后使用 gii 覆盖模型。但是当我试图保存到该表中时,它显示属性(这是我删除的旧列)未定义。请为我提供一个解决方案。
3 回答
您需要rules()
在模型的验证方法中定义所有列,查看并确保您已经为表中的每一列定义了规则,例如(如果它是一个最大长度为 128 的字符串):
public function rules()
{
return array(
...
array('myField', 'length', 'max'=>128),
...
);
}
查看有关验证规则的一些信息。
此外,对于表单,如果您使用 CActiveForm 小部件并像这样调用字段:
echo $form->labelEx($model,'myField');
echo $form->textField($model,'myField');
然后您需要确保在模型中也定义了标签,在attributeLabels()
方法中,例如:
public function attributeLabels()
{
return array(
...
'myField'=>'My Field',
...
);
}
最后,如果您希望该字段可搜索,则需要search()
在模型中的方法中添加一条语句,例如:
public function search()
{
...
$criteria->compare('myField',$this->myField);
...
}
确保您拥有所有这些元素,并且您不应该收到“* is not defined”错误。
此外,如果您在主配置文件中使用模式缓存,则必须在应用程序看到您的新数据库结构之前清除缓存。
您的更改也应该在视图中设置,因为有使用旧属性的表单、小部件!(对于这个确切的保存问题,您需要修复模型保存和更新操作_form.php
的部分责任。
您可以像对模型所做的那样做同样的事情:(使用 gii 重新生成它)或者您可以手动编辑它(我建议您习惯这一点,因为将来您将拥有不想丢失的代码,因为更改列名。Find & edit
在大多数文本编辑器中都很简单)。
可能您需要阅读更多关于MVC 的一般工作原理和 Yii 的特殊工作原理
这是因为您使用的是模式缓存。你的表模式缓存在 Yii 中。您需要刷新 AR 缓存。要么刷新完整的模式缓存,要么使用 Yii::app()->db->schema->getTable('tablename', true); 在你的行动开始。这将更新模型模式缓存。