2013-11-25 76 views
4

我試圖重現一個ActiveRecord標準的SQL語句:SQL ActiveRecord不同標準

SELECT COALESCE(price, standardprice) AS price 
FROM table1 
LEFT JOIN table2 
ON (pkTable1= fkTable1) 
WHERE pkTable1= 1 

到目前爲止,我有以下幾點:

$price = Table1::model()->find(array(
    "select" => "COALESCE(price, standardprice) AS price", 
    'with' => array(
     'table2' => array(
      'joinType' => 'LEFT JOIN', 
      'on' => 'pkTable1= fkTable1', 
     ) 
    ), 
    'condition' => 'pkTable1=:item_id', 
    'params' => array(':item_id' => 1) 
)); 

但這會導致到以下錯誤:'Active record "Table1" is trying to select an invalid column "COALESCE(price". Note, the column must exist in the table or be an expression with alias.

雖然列應該存在,但下面是兩個表結構:

表1

pkTable1  int(11) - Primary key 
standardprice decimal(11,2) 
name   varchar(255) //not important here 
category  varchar(255) //not important here 

表2

pkTable2  int(11) - Primary key //not important here 
fkType   int(11) - Foreign key //not important here 
fkTable1  int(11) - Foreign key, linking to Table1 
price   decimal(11,2) 

我究竟在做什麼錯?

+2

嘗試替換您的選擇,如下所示:'「select」=> array(「COALESCE(price,standardprice)AS price」)'。這可能有助於理解逗號不是列分隔符。 –

回答

0

我已經設法解決這個問題,如下所示:將COALESCE表達式包裝在數組中,並將別名更改爲表中現有的列名。

$price = Table1::model()->find(array(
    "select" => array("COALESCE(price, standardprice) AS standardprice"), 
    'with' => array(
     'table2' => array(
      'joinType' => 'LEFT JOIN', 
      'on' => 'pkTable1= fkTable1', 
     ) 
    ), 
    'condition' => 'pkTable1=:item_id', 
    'params' => array(':item_id' => 1) 
)); 

感謝Willemn Renzema幫助我完成陣列部分。我仍然不完全確定爲什麼別名需要是現有的列名稱(在這種情況下,表1中不存在price的錯誤)。

1

您將需要使用一個CDbExpressionCOALESCE()表達:

$price=Table1::model()->find(array(
    'select'=>array(
     new CDbExpression('COALESCE(price, standardprice) AS price'), 
    ), 
    'with' => array(
     'table2' => array(
      'joinType'=>'LEFT JOIN', 
      'on'=>'pkTable1=fkTable1', 
     ), 
    ), 
    'condition'=>'pkTable1=:item_id', 
    'params'=>array(':item_id'=>1) 
)); 

我進一步相信,如果table2已經在你的表1模型relations()方法被掛,以下行應該足夠了:

'with'=>array('table2'), 
+0

謝謝你指出關係()的東西。你是對的。但是CDbExpression並沒有解決這個問題,對於COALESCE來說也不需要。 –

+0

真的嗎?呃,我可以*宣誓* CDbExpression'這是必要的... – DaSourcerer