2

在我的 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]: Syntax error or access violation: 1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'key='sitename' LIMIT 1' 附近使用正确的语法。执行的 SQL 语句是:SELECT value FROM siteconfig t WHERE key=:key LIMIT 1

我哪里做错了?

4

3 回答 3

3

您用于key列名,这是MySQL 中的保留字。Yii 在查询中使用表别名,但不会特别注意将保留字用作列名的情况。所以,你必须自己处理这件事。

例如:

$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);

这应该可以解决您的问题。

于 2012-03-23T08:54:30.410 回答
1

正如@Dmitry 解释的那样,SQL 不允许您使用列 name key。答案中代码中的 Yii 调用有效,因为 Yii 使用参数保留字以外的名称自动执行参数绑定。而且它还使用完全限定的列名(所有列名引用的前缀都带有<tablename>.,无论您传递该findByAttributes方法的无效列名(保留字)是什么。

于 2012-03-24T03:25:49.840 回答
0

现在可以了.. ^^

我只是使用此代码...

$etona = SiteConfigurationRecord::model()->findByAttributes(array('key'=>'sitename'));

也许我需要以某种方式更多地研究activerecord...

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

于 2012-03-23T07:31:38.807 回答