【问题标题】:Data can't save after alter the table in yiiyii修改表后数据无法保存
【发布时间】:2012-09-19 06:38:11
【问题描述】:

我是 yii 框架的新手。我在 yii 框架中创建了一个应用程序。我使用 gii 创建了模型、控制器、视图。之后我更改数据库表。我删除了 2 列并添加了 3 个新列。之后使用 gii 覆盖模型。但是当我试图保存到该表中时,它显示属性(这是我删除的旧列)未定义。请为我提供一个解决方案。

【问题讨论】:

  • 检查你的模型类,看看旧的模型类是否已经被新的模型类替换了......同时检查你用来保存在数据库中的模型类......

标签: php yii


【解决方案1】:

您需要在模型的验证rules() 方法中定义所有列,查看并确保您已经为表中的每一列定义了规则,例如(如果它是一个最大长度的字符串128):

public function rules()
{
    return array(
        ...
        array('myField', 'length', 'max'=>128),
        ...
    );
}

查看有关validation rules 的一些信息。

此外,如果您使用 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);
    ...
}

确保所有这些元素都存在,并且不应出现“*未定义”错误。

此外,如果您在主配置文件中使用架构缓存,则必须先清除缓存,然后应用才能看到您的新数据库结构。

【讨论】:

    【解决方案2】:

    您的更改也应该在 Views 中设置,因为有表单,widgets 使用旧属性! (对于这个确切的保存问题,您需要修复 _form.php,这是您的模型保存和更新操作中负责的 partial

    您可以像对模型所做的那样做同样的事情:(使用 gii 重新生成它)或者您可以手动编辑它(我建议您习惯这一点,因为将来您将拥有您不想要的代码只是因为更改了列名而松动。大多数文本编辑器中的简单Find & edit 就可以完成这项工作。

    您可能需要阅读更多关于how MVC works in general & in Yii in special的信息

    【讨论】:

      【解决方案3】:

      这是因为您使用的是模式缓存。你的表模式缓存在 Yii 中。您需要刷新 AR 缓存。刷新完整模式缓存或使用 Yii::app()->db->schema->getTable('tablename', true);在你的行动开始。这将更新模型模式缓存。

      【讨论】:

        猜你喜欢
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 2014-08-21
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多