0

次のSQLをCActiveDataProviderで使用するCDBCriteriaに変換するのに苦労しています: "SELECTPresetDeviceLink。 Device。FROMPresetDeviceLink INNER JOIN Device ON Device.id = ResetDeviceLink.deviceId WHERE Device.roomId = 1"

テーブルの構造は次のとおりです。

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       |                |
+-------------+--------------+------+-----+---------+----------------+

コントローラのコードは次のとおりです。

$criteria = new CDbCriteria;
$criteria->select = 'PresetDeviceLink.*, Device.*';
$criteria->join = 'INNER JOIN Device ON Device.id = PresetDeviceLink.deviceId';
$criteria->condition = 'Device.roomId = 1';

$presetDeviceLink=new CActiveDataProvider('PresetDeviceLink', array(
    'criteria' => $criteria,
));

実行すると、次のエラーが発生します。

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 

奇妙なことに、CActiveDataProviderソースとして「Device」を使用し、joinステートメントを「PresetDeviceLink」に結合するように変更すると、Device.roomId列が見つからないと文句を言います。

CActiveDataProviderがどのように機能するのか理解できませんか?CActiveDataProviderに渡すテーブルのフィールドからの条件(joinまたはwhere句で)のみを使用できるように見えます。何かアドバイス?

PS-SQLクエリはMySQLコンソールで美しく機能します。

よろしくお願いします、ベン

4

1 に答える 1

1

「実行されたSQLステートメントは:」の行に示されているように、最初のテーブルはにエイリアスされていましたt。これはYiiの標準的な動作です。

この結果、の代わりにそのエイリアスを使用してそのテーブルを参照する必要がありますPresetDeviceLink$criteria->alias = 'PresetDeviceLink';または、で使用する前に設定を試すこともできますがCActiveDataProvider、私は個人的にそのオプションを試していませんが、機能するはずです。

于 2012-04-24T05:35:49.273 に答える