2

私は2つのテーブルを持ってい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つしかないため、注文のみを取得したいという意味です。
これを試してみました:

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の配列です。

まず第一に、問題は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行目でも同じ問題です。
もう1つ:3行目であるyiiでサブクエリを使用する方法がよくわかりません。
助言がありますか?

4

2 に答える 2

3

order.id試してみる代わりにt.id

これは、$criteria->withオプションを使用している場合、そのテーブルをクエリに結合しているため、テーブルに1つ、テーブルに1つ、合計2つidのフィールドがあるためです。orderorder_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 に答える