2

我有两张桌子orderorder_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 ids 的数组。

首先问题出在第四行。

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行。
有什么建议么?

4

2 回答 2

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);
于 2012-12-04T12:41:21.407 回答
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);
于 2012-12-04T14:28:19.297 回答