2

YiiフレームワークでCDBCriteriaを使用して結合クエリを実行しようとしています。問題は、結合クエリは正常に機能しますが、他のテーブルの列が表示されないことです。

私は次のようにやっています

$criteria = new CDbCriteria;

$criteria->order = 't.id desc';

$criteria->select = '*';

$criteria->join = ' INNER JOIN table2 INNER JOIN table3 INNER JOIN table4';

これを実行すると、メールテーブル1の列のみが表示されます。他の列は表示されていません。

私のモデルクラスでは、関係があります

public function relations()
{
  // NOTE: you may need to adjust the relation name and the related
  // class name for the relations automatically generated below.
    return array(
      'user' => array(self::BELONGS_TO, 'DmPhoneUser', 'user_id'),
      'command' => array(self::BELONGS_TO, 'DmOtaCommand', 'command_id'),
      'partner' => array(self::BELONGS_TO, 'DmPartner', 'partner_id'),
    );
}

** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * **

public function actionGetHistory($start, $per_page)
{
    $partner_id = '10';
    $criteria = new CDbCriteria;
    $criteria->order = 't.history_id desc';
    $criteria->select = 't.*, table2.*';
    $criteria->join = ' INNER JOIN table2 ON t.command_id = table2.command_id';
    $result = Table_1_class::model()->with('command')->findAll();
    $history_data = CJSON::encode($result);
    echo $history_data;
}

ここで、command_idはtable1とtable2で共通です。

これが私が基準コードを使用している方法です。

4

1 に答える 1

4

私が言ったように、YiiのActive Record実装は、テーブル自体またはリンク先のテーブルで定義された列のみを使用withし、結果セットで返す任意の列は使用しません。

解決策1:との関係を定義し、table2その関係をに追加してwith、を削除しjoinます。次に、返された各オブジェクトを配列に変換する必要がありますCJSON::encode。リレーションを持つモデルは適切に処理されません。

解決策2:Yii::app()->db->createCommand("SQL query")->queryAll();ActiveRecordの代わりに使用します。これにより、配列の配列が生成されCJSON::encodeますが、問題はありません。

于 2012-04-26T05:37:57.247 に答える