2013-10-18 33 views
3

我有以下查询:Yii的活动记录COALESCE不显示结果

$result = Table1::model()->findAll(array(
    'with' => array(
       'table2' => array(
        'joinType' => 'LEFT JOIN', 
        'on' => 'pk = fk AND fk=1' 
       ) 
      ), 
    'select' => array('name', 
         'COALESCE(table2.price, t.standardprice) AS price', 
         'COALESCE(table2.period, t.period) AS period') 
    ) 
); 

我的目标是挑选表2的领域,如果这些被填充,但是如果这些都是空的/没有行发现,原来表的字段应被显示。

但是,我的输出与预期不符。 price字段在我的结果的属性中完全不显示,而period字段为table2的值或为空。

编辑:也许我的SQL是错误的地方。使用这个SQL给我想要的结果:

SELECT name, COALESCE(tb1.price, tb2.standardprice) as price, COALESCE(tb1.period, tb2.period) as period 
FROM table1 as tb1 
LEFT JOIN table2 as tb2 
ON (tb1.pk= tb2.fk) AND fk=1; 

然而,我没有看到我目前的代码有任何区别。

EDIT2:表结构:

表1(原始表)

pk   (int 11) - Primary key, auto increment 
name   (varchar 255) 
standardprice (decimal 11,2) 
period  (varchar 255) 
fkLanguage //not relevant 
photo   //not relevant 
description //not relevant 
link   //not relevant 

表2

ID  (int 11) - Primary key, auto increment 
fk  (int 11) - Foreign key, which links to pk of table1 
period (varchar 255) 
price (decimal 11,2) 
fkType //not relevant 
amount //not relevant 

澄清:该fk=1确实是一个JOIN条件。如果fk不是1,那么我不希望这些行加入,而是从table1中取值。

+0

你为什么要补充一点:和FK = 1? –

+0

@AladdinHoms我只需要从第二个表中选择某些行的ID,而不是全部。稍后,这将成为一个参数,如'fk =:id' –

+0

您是否在模型Tablename的表中有属性'price'和'period'?你能展示它的结构吗? – CreatoR

回答

1

您需要添加列price以解析模式中不存在的列。
尝试修改模型表1()

  • 添加public $price;
  • 覆盖方法attributeNames到以下几点:
public function attributeNames() 
    { 
     $colums = parent::attributeNames(); 
     $colums[] = 'price'; 
     return $colums; 
    } 
+0

我们可以进行私人聊天吗?我真的不明白你的解决方案如何工作,或者在哪里添加这个功能。 –

+0

是的,但我不知道如何,我在这里不到2周...我在等你的请求 – CreatoR

+0

哈哈我希望你知道。那么我想我们可以使用这个空房间:http://chat.stackoverflow.com/rooms/37891/php-for-noobs –

0

我认为你应该这样做:

$result = Tablename::model()->findAll(array(
'with' => array(
      'tabel2' => array(
       'joinType' => 'LEFT JOIN', 
       'on' => 'pk = fk' 
      ) 
     ), 
'select' => array('name', 
        'COALESCE(tabel2.price, t.standardprice) AS price', 
        'COALESCE(tabel2.period, t.period) AS period'), 
'condition'=> ' fk = 1 ' 
)); 

因为FK = 1是不是的上陈述的一部分;这只是一个条件。我认为这会对你有所帮助。

+0

这不起作用,即使它看起来合乎逻辑。这只返回table2具有匹配的'fk'的行。我需要的是所有行,并且如果table2没有匹配的键,它将填充table1中给出的“默认”值。 –