2012-12-04 67 views
2

工作,我有兩個表order和​​Yii的使用標準

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變量是orderid在數組。所有的問題

首先是在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日線。
另:我真的不知道如何使用子查詢中警予,這是第3行。
有什麼建議?

+1

的Yii不關心原始表名,在這種情況下, '訂單',它只關心關係名稱。在這種情況下,原始表格始終是't','order_version'是'orderVersions'。 – adamors

+0

好吧,別名很清楚,謝謝。子查詢呢?實際上,如果我用'orderVersions'替換'order_version',我有一個錯誤'Table'imdb.orderVersions'不存在'。也許這是因爲WHERE子句? –

回答

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); 
+1

這工作得很好,除了一件事。 'findAll()'返回正確的順序,但是它在表中遇到了第一個order_version。例如:關於我的問題中的表格描述,如果我做'MAX(orderVersions.status)= 2',它只返回正確的第一個順序,但是也有第一個版本。是否有可能返回第一個訂單,但所有的版本? –

+0

是的,刪除''having''子句,並在'order'子句後添加''limit'=> 1'',同時刪除''group''子句。 <不正確:如果你想要所有的版本,你將不得不返回多行,但是如果你這樣做,我只會使用2個查詢,一個用於獲取所需的順序,另一個用於獲取所有版本。否則,您將返回大量不必要的數據 – Julian

3

而不是order.id嘗試t.id

這是因爲當你使用$criteria->with選擇要加入該表到查詢,所以會有兩個id場,一個在order表,一個在​​表。

Yii通常會給你正在查詢的主表(order在這種情況下)一個別名t,我想通常會給任何表加入一個關係的關係名稱的別名。

如果您想獲得實際的別名警予被使用,您可以使用getTableAlias。但我不認爲你將能夠爲你調用findAll()靜態你的情況來使用。如果你的模型範圍內使用它,你可以把它像這樣:

$alias = $this->getTableAlias(); 

還是喜歡,所以如果您使用的是默認的範圍或其他地方,你不希望運行額外的檢查或引用別名;

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

好的,非常感謝。但到處都是我所說的,我沒有。我這樣做:'$ alias = Order :: model() - > getTableAlias();' –

+2

getTableAlias()在模型中調用它時非常有用,即靜態地不像調用findAll()那樣一些額外的信息來嘗試和解釋如何在其他情況下使用。嘗試使用t.id而不是order.id? – Stu

+0

是的,這工作得很好。但仍然在子查詢問題... –