在我的Yii应用程序中,我有一个代表siteconfig
表的模型,有四列:
config_id
,key
,value
,update_time
。我使用Gii创建了一个模型(以确保我不会犯任何错误)。我不会在这里发布整个代码,因为这是我100%未修改的,Gii生成的标准模型代码。由于我的问题与搜索有关,我只发布生成代码的重要部分(search()
方法):
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('config_id',$this->config_id);
$criteria->compare('key',$this->key,true);
$criteria->compare('value',$this->value,true);
$criteria->compare('update_time',$this->update_time,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
我正在尝试在正常的Yii ActiveRecord搜索中使用生成的模型:
$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "key=:key";
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);
但是,不是获得预期的搜索结果,而是出现一个奇怪的(对我来说)错误:
CDbCommand无法执行SQL语句:SQLSTATE [42000]: 语法错误或访问冲突:1064 SQL中有错误 句法;查看与MySQL服务器版本对应的手册 要在第1行'key ='sitename'LIMIT 1'附近使用正确的语法。 执行的SQL语句是:SELECT value FROM
siteconfig
t
WHERE key =:key LIMIT 1
我哪里出错了?
答案 0 :(得分:3)
您使用key
作为列名,即reserved word in MySQL。 Yii在查询中使用table alias,但在将reserverd字用作列名时不会特别小心。所以,你必须自己照顾这个。
例如:
$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "t.key=:key"; // 't' is default alias
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);
这可以解决您的问题。
答案 1 :(得分:1)
正如@Dmitry解释的那样,SQL不允许您使用列名key
。你的答案中的代码中的Yii调用是有效的,因为Yii使用参数之外的保留字以外的名称自动执行参数绑定。它还使用完全限定的列名称(所有列名称引用前缀为<tablename>.
,无论您通过findByAttributes
方法的无效列名称(保留字)。
答案 2 :(得分:0)
现在它有效.. ^^
我只是使用这段代码......
$etona = SiteConfigurationRecord::model()->findByAttributes(array('key'=>'sitename'));
也许我需要以某种方式研究activerecord ......
但我仍然不知道为什么上面的代码不起作用