Yii CActiveRecord,列名为“attributes”

时间:2013-12-09 06:25:06

标签: yii attributes cactiverecord

我使用旧数据库中的CRUD生成器。搜索列值时,出现以下错误:

  

htmlspecialchars()期望参数1为字符串,给定数组(/usr/local/share/yii/framework/web/helpers/CHtml.php:103)

问题是模型有一个名为“attributes”的现有列,它会产生冲突。我从_search.php中删除了该条目并注释掉了模型中的所有实例,希望至少让它工作但没有运气。任何建议将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

每个CActiveRecord实例(或CModel实例)都有一个名为attributes的getter / setter,可以使用它设置所有属性。这会导致冲突,因为生成的crud代码使用attributes属性,期望它如前所述工作。

控制器执行以下操作:

$model->attributes=$_POST['ModelClassName'];
// or 
$model->attributes=$_GET['ModelClassName'];

这意味着立即设置模型的(安全)属性。相反,它会覆盖旧数据库模型的数据库属性attributes

这反过来会导致您描述的错误,因为$_GET['ModelClassName']$_POST['ModelClassName']通常包含数据数组。

我想最简单的解决办法就是直接调用setter函数来处理“普通”attributes行为,这会导致用以下内容替换上面提到的行:

// in the controller
$model->setAttributes($_POST['ModelClassName']);
// and 
$model->setAttributes($_GET['ModelClassName']);

我认为其余生成的CRUD代码(视图)可以而且应该保持不变,以使其正常工作。

如果您想了解其工作原理和原因,最好在__get__set魔术函数中使用research以及它们如何在yii框架。