2

siteconfig私のYiiアプリケーションには、テーブルを表すモデルがあり、4つの列があります。

  • 整数config_id
  • 文字列key
  • 文字列value
  • 文字列update_time

Giiを使用してモデルを作成しました(間違いを犯さないようにするため)。ここではコード全体を公開していません。これは、Giiによって生成された標準モデルコードである私が100%変更していないためです。私の問題は検索に関連しているので、生成されたコードの重要な部分(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,
    ));
}

私は生成されたモデルを通常のYiiActiveRecord検索で次のように使用しようとしています:

$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]:構文エラーまたはアクセス違反:1064SQL構文にエラーがあります。1行目の'key='sitename'LIMIT 1'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。実行されたSQLステートメントは次のとおりです。SELECTvalue FROM siteconfig t WHERE key =:key LIMIT 1

どこで私は間違えましたか?

4

3 に答える 3

3

MySQLで予約語でkeyある列名に使用しました。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では列名を使用できません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 に答える