使用CDBCriteria执行连接查询

时间:2012-04-25 13:24:50

标签: php inner-join criteria yii

我正在尝试使用Yii框架中的CDBCriteria进行加入查询。问题是连接查询是否成功运行,但它不显示其他表中的列。

我正在以下列方式做事

$criteria = new CDbCriteria;

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

$criteria->select = '*';

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

当我运行它时,我只能看到显示的邮件table1列。其他列未显示。

在我的模型课中,我有关系

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中很常见。

这就是我使用标准代码的方式。

1 个答案:

答案 0 :(得分:4)

正如我所说,Yii的Active Record实现只会使用表本身定义的列或通过with链接到的表,而不是在结果集中返回的任意列。

解决方案1:定义与table2的关系,将该关系添加到with,然后摆脱join。然后你可能需要将每个返回的对象转换为数组 - CJSON::encode将无法处理关系良好的模型。

解决方案2:使用Yii::app()->db->createCommand("SQL query")->queryAll();代替Active Record。这将产生一个数组数组,CJSON::encode将没有问题。