我一直在努力将以下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
奇怪的是,如果我使用'Device'作为CActiveDataProvider源并更改join语句以加入'PresetDeviceLink',它会抱怨无法找到Device.roomId列。
我是否只是不了解CActiveDataProvider的工作原理?在我看来,我只能使用表中传递给CActiveDataProvider的字段中的条件(在join或where子句中)。有什么建议吗?
PS - SQL查询在MySQL控制台中运行良好。
提前致谢, 本
答案 0 :(得分:1)
如“执行的SQL语句:”行中所示,第一个表的别名为t
。这是Yii的标准行为。
因此,您应该使用该别名来引用该表而不是PresetDeviceLink
。或者你可以尝试在$criteria->alias = 'PresetDeviceLink';
中使用它之前设置CActiveDataProvider
,虽然我没有亲自尝试过这个选项,但它应该有效。