我有两张表order
和order_version
order
| id |
| 1 |
| 2 |
order_version
| id | order_id | status |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 1 | 1 |
| 4 | 1 | 2 |
我想查找所有已更改版本的订单。这意味着我只想获得id='1'
的订单,因为另一个订单尚未更改且只有一个版本
试过这个:
1) $criteria = new CDbCriteria();
2) $criteria->with = array('orderVersions');
3) $criteria->addCondition("(SELECT MAX(status) FROM order_version) != '0'");
4) $criteria->addInCondition('order.id', $orderArray);
5) $criteria->order = 'order.id DESC';
6) $orders = Order::model()->findAll($criteria);
$orderArray
变量是order
id
s的数组。
首先问题出在第4行。
Column not found: 1054 Unknown column 'order.id' in 'where clause'
如果我只是id
而不是order.id
,那么我有
Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous.
第5行同样的问题。
另一个:我真的不知道如何在yii中使用子查询,这是第3行
有什么建议吗?
答案 0 :(得分:3)
而不是order.id
尝试t.id
。
这是因为当您使用$criteria->with
选项时,您将该表加入查询,因此将有两个id
字段,一个在order
表中,另一个在order_version
表。
Yii通常会给你要查询的主表(在这种情况下为order
)别名t
,我认为通常会给关系加入的任何表都是他们的关系名称的别名。
如果你想获得yii正在使用的实际别名,你可以使用getTableAlias。但我不认为您可以在您的情况下使用此功能,因为您静态调用findAll()
。如果您在模型上下文中使用它,您可以这样称呼它:
$alias = $this->getTableAlias();
或者是这样,如果你在默认范围或其他地方使用,你不想运行额外的检查或引用别名;
$alias = $this->getTableAlias(false,false);
答案 1 :(得分:1)
从您的文字中我得出结论,您希望获得状态不等于0(或大于零)的所有订单?试试这个:
$criteria = new CDbCriteria(array(
'together' => TRUE,
'with' => array('orderVersions' => array(
'having' => 'MAX(`orderVersions`.`status`) > 0'
)),
'order' => '`t`.`id` DESC'
));
$criteria->addInCondition('`t`.`id`',$orderArray);
如果您只想要具有最高版本的分组订单,但状态高于0:
$criteria = new CDbCriteria(array(
'together' => TRUE,
'with' => array('orderVersions' => array(
'having' => 'MAX(`orderVersions`.`status`) > 0'
)),
'order' => 'MAX(`t`.`id`) DESC',
'group' => '`t`.`id`'
));
$criteria->addInCondition('`t`.`id`',$orderArray);