Yii使用标准

Yii使用标准,yii,criteria,Yii,Criteria,我有两张桌子订购和订购 我想查找所有已更改版本的订单。这意味着我只想获得id='1'的订单,因为另一个订单没有更改,只有一个版本。 我试过这个: 1) $criteria = new CDbCriteria(); 2) $criteria->with = array('orderVersions'); 3) $criteria->addCondition("(SELECT MAX(status) FROM order_version) != '0'"); 4) $c

我有两张桌子订购和订购

我想查找所有已更改版本的订单。这意味着我只想获得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变量是订单ID的数组。首先,问题在第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.
第五行也有同样的问题。 另一个:我真的不知道如何在yii(第三行)中使用子查询。 有什么建议吗?

请不要订购。请尝试t.id

这是因为当您使用$criteria->with选项时,您正在将该表连接到查询,因此将有两个id字段,一个在order表中,另一个在order\u版本表中

Yii通常会给您正在查询的主表一个别名t,我想通常会给任何通过关系连接的表一个别名,即它们的关系名

如果您想获得yii使用的实际别名,可以使用。但我不认为你能在你的案例中使用这个,因为你静态地调用findAll。如果您在模型上下文中使用它,您可以这样称呼它:

$alias = $this->getTableAlias();
或者,如果您在默认范围内或其他不想运行额外检查或引用别名的地方使用,则可以这样做

$alias = $this->getTableAlias(false,false);
请尝试t.id,而不是order.id

这是因为当您使用$criteria->with选项时,您正在将该表连接到查询,因此将有两个id字段,一个在order表中,另一个在order\u版本表中

Yii通常会给您正在查询的主表一个别名t,我想通常会给任何通过关系连接的表一个别名,即它们的关系名

如果您想获得yii使用的实际别名,可以使用。但我不认为你能在你的案例中使用这个,因为你静态地调用findAll。如果您在模型上下文中使用它,您可以这样称呼它:

$alias = $this->getTableAlias();
或者,如果您在默认范围内或其他不想运行额外检查或引用别名的地方使用,则可以这样做

$alias = $this->getTableAlias(false,false);

从你的文本中,我得出结论,你想得到所有状态不等于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);

从你的文本中,我得出结论,你想得到所有状态不等于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);

Yii不关心原始表名,在本例中,它只关心关系名。原始表始终别名为t,本例中的order_版本为orderVersions。好的,有了别名就清楚了,谢谢。子查询呢?事实上,如果我用orderVersions替换order\u版本,我就有一个错误表“imdb.orderVersions”不存在。可能是因为WHERE子句?Yii不关心原始表名,在本例中,它只关心关系名。原始表始终别名为t,本例中的order_版本为orderVersions。好的,有了别名就清楚了,谢谢。子查询呢?事实上,如果我用orderVersions替换order\u版本,我就有一个错误表“imdb.orderVersions”不存在。也许是因为WHERE条款?好的,非常感谢。但无论我叫它到哪里,我都会得到t。我做:$alias=Order::model->getTableAlias;当您从模型中调用getTableAlias时,它会更有用,也就是说,不像您调用findAll那样静态地调用它,这只是一些额外的信息,可以尝试解释如何在其他情况下使用它。试着用t.id代替订单。id?好的,非常感谢。但无论我叫它到哪里,我都会得到t。我做:$alias=Order::model->getTableAlias;当您从模型中调用getTableAlias时,它会更有用,也就是说,不像您调用findAll那样静态地调用它,这只是一些额外的信息,可以尝试解释如何在其他情况下使用它。试着用t.id代替order.id?那很好,除了一件事。findAll返回正确的订单,但它在表中遇到了第一个订单版本。例如:关于我问题中的表描述,如果我使用MAXorderVersions.status=2,则只返回正确的第一个订单,但也返回正确的第一个版本。是否可以返回第一个订单,但返回所有版本?是的,删除“having”子句,并在“order”子句后添加一个“limit”=>1,同时删除“group”子句不正确:如果需要所有版本,则必须返回多行,但如果需要,我将只使用两个查询,一个用于获取所需的订单,另一个用于获取所有版本。否则,您将返回大量工作正常的不必要数据,除了一件事。findAll返回正确的订单,但它在表中遇到了第一个订单版本。例如:雷加 在我的问题中,如果我使用MAXorderVersions.status=2,它只返回正确的第一个订单,但也返回第一个版本。是否可以返回第一个订单,但返回所有版本?是的,删除“having”子句,并在“order”子句后添加一个“limit”=>1,同时删除“group”子句不正确:如果需要所有版本,则必须返回多行,但如果需要,我将只使用两个查询,一个用于获取所需的订单,另一个用于获取所有版本。否则,您将返回大量不必要的数据