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: テーブル構造:

Table1 (元のテーブル)

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;
  • メソッドの attributeNames を次のようにオーバーライドします。
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 に答える