ActiveRecord搜索返回“语法错误或访问冲突”错误

时间:2012-03-23 06:47:33

标签: activerecord yii mysql-error-1064 yii-cmodel

在我的Yii应用程序中,我有一个代表siteconfig表的模型,有四列:

  • 整数config_id
  • string key
  • string value
  • string 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

我哪里出错了?

3 个答案:

答案 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 ......

但我仍然不知道为什么上面的代码不起作用