2012-04-23 10 views
0

私はCActiveDataProviderで使用するCDBCriteriaに次のSQLの変換に苦労してきたが見つかりません。 は「PresetDeviceLinkを選択、デバイス PresetDeviceLink INNER FROM Device.id = PresetDeviceLink上のデバイスを登録しよう。次のように私のコントローラでYiiのCDbCriteria結合列は、

mysql> describe PresetDeviceLink; 
+----------+---------+------+-----+---------+----------------+ 
| Field | Type | Null | Key | Default | Extra   | 
+----------+---------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| presetId | int(11) | NO |  | NULL |    | 
| deviceId | int(11) | NO |  | NULL |    | 
| state | int(11) | NO |  | 0  |    | 
| value | int(11) | NO |  | 32  |    | 
+----------+---------+------+-----+---------+----------------+ 

mysql> describe Device; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| ref   | int(11)  | NO |  | NULL |    | 
| roomId  | int(11)  | NO |  | NULL |    | 
| typeId  | int(11)  | NO |  | NULL |    | 
| paired  | tinyint(1) | NO |  | 0  |    | 
| name  | varchar(255) | YES |  | NULL |    | 
| description | text   | YES |  | NULL |    | 
| dimmerPos | int(11)  | NO |  | 0  |    | 
+-------------+--------------+------+-----+---------+----------------+ 

私のコードは次のとおり:

次のようにDevice.roomId = 1"

表構造であるのDeviceID私はCActiveDataProviderソースとして「デバイス」を使用し、「PresetDeviceLink」に参加する声明を参加変更した場合

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: <b>Column not 
found</b>: 1054 Unknown column 'PresetDeviceLink.deviceId' in 'on clause'. The SQL 
statement executed was: SELECT COUNT(*) FROM `PresetDeviceLink` `t` INNER JOIN 
Device ON Device.id = PresetDeviceLink.deviceId WHERE Device.roomId = 1 

奇妙なことは、ある、それはその後、と文句を言います:私は次のエラーを取得する実行10

Device.roomId列が見つかりませんでした。

CActiveDataProviderの仕組みを理解できませんか?私がCActiveDataProviderに渡すテーブル内のフィールドからの条件(joinまたはwhere句内)のみを使用できることがわかります。何かアドバイス?

PS - SQLクエリは、MySQLコンソールで美しく動作します。事前に

おかげで、に表示されたよう ベン

答えて

1

「実行されたSQL文は:」行は、最初の表は、tにエイリアスされました。これはYiiの標準的な動作です。

この結果、その別名を使用してPresetDeviceLinkではなくそのテーブルを参照する必要があります。あるいは、CActiveDataProviderで使用する前に$criteria->alias = 'PresetDeviceLink';を設定してみることもできますが、私は個人的にそのオプションを試しませんでした。

+0

パーフェクト - ありがとう。しかし、エイリアスを見つけたはずですが、私はこれもドキュメントに記載されていると思いました!両方の提案がうまくいった。私は、コードの明快さのためにエイリアスを設定することを選択しました。助けてくれてありがとう! – Ben

+1

私はそれを取り戻します - それはドキュメントにあります。明らかにそうではありません。 http://www.yiiframework.com/doc/api/1.1/CDbCriteria - 「エイリアス」セクションで説明しています。 – Ben