0

我一直在努力将以下 SQL 转换为 CDBCriteria 以与 CActiveDataProvider 一起使用:“SELECT PresetDeviceLink. , Device. FROM PresetDeviceLink INNER JOIN Device ON Device.id = PresetDeviceLink.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 源并将连接语句更改为“PresetDeviceLink”,它会抱怨找不到 Device.roomId 列。

我只是不明白 CActiveDataProvider 是如何工作的吗?在我看来,我只能使用传递给 CActiveDataProvider 的表中字段的条件(在联接或 where 子句中)。有什么建议吗?

PS - SQL 查询在 MySQL 控制台中运行良好。

在此先感谢,本

4

1 回答 1

1

正如在“执行的 SQL 语句是:”行中可见的,第一个表的别名为t. 这是 Yii 的标准行为。

因此,您应该使用该别名来引用该表,而不是PresetDeviceLink. 或者您可以$criteria->alias = 'PresetDeviceLink';在 中使用它之前尝试设置CActiveDataProvider,虽然我没有亲自尝试过该选项,但它应该可以工作。

于 2012-04-24T05:35:49.273 回答