3

我有以下查询:

$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')
    )
);

我的目标是选择 table2 的字段(如果已填写),但如果这些字段为空/未找到任何行,则应显示原始表的字段。

但是,我的输出不如预期。该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 中获取值。

4

2 回答 2

1

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

  • 添加public $price;
  • 将方法属性名称覆盖为以下内容:
public function attributeNames()
  {
      $colums = parent::attributeNames();
      $colums[] = 'price';
      return $colums;
  }
于 2013-10-21T13:52:30.387 回答
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 不是 on 语句的一部分;这只是一个条件。我认为这会对你产生影响。

于 2013-10-18T19:46:40.793 回答