Yii CActiveDataProvider从连接表中加入并选择

时间:2012-06-26 09:58:48

标签: yii

我有以下示例代码:

                $dataProvider = new CActiveDataProvider('firstTable', 
                    array('criteria' => array(
                        'select' => 't.firstfield,secondTable.secondfield',
                        'join' => 'join secondTable on secondTable.id=t.secondTable_id',
                    ),
                    'pagination' => array(
                        'pageSize' => 10,
                    ),
                ));
                $results=$dataProvider->getData();

运行上面的代码后,firstField(来自model表 - firstTable)在对象中可用,但secondField(来自连接表 - secondTable)不是。

任何人都可以提供有关代码错误或“选择”选项未获取第二个字段的原因的帮助吗?

2 个答案:

答案 0 :(得分:6)

如果你使用CDbCriteria会更好,它有一个更好的解决方案,可以在关系的帮助下连接表。我可以用CDbCriteria显示示例。

$criteria = new CDbCriteria;
$criteria->select = 'firstfield';
$criteria->with = array('secondTable_relation'=>array('select'=>'secondfield'));
$dataProvider = new CActiveDataProvider('firstTable', 
                    array('criteria' => $criteria,
                    'pagination' => array(
                        'pageSize' => 10,
                    ),
                ));
                $results=$dataProvider->getData();

secondTable_relation是具有secondTable的关系名称。

答案 1 :(得分:0)

  

任何人都可以提供有关代码错误或“选择”选项未获取第二个字段的原因的帮助吗?

答案:

这种情况正在发生,因为您没有选择与两个表相关的字段,即firstTable中的外键:secondTable_id。所以如果你这样做:

'select' => 't.firstfield,t.secondTable_id,secondTable.secondfield',

您将能够访问secondTable的secondField:

$singleresultrow->secondTableRelationName['secondField'];// a single result row can be obtained by foreach iteration over $results

但是,当您访问secondField时,仍会有另一个查询(延迟加载)。返回的初始(懒惰之前)对象将不会填充secondTable对象。

我认为问题在于默认情况下 yii通过延迟加载访问相关字段,为此,相关的 foreign_key 应该出现在你试图制作数据提供者的模型,这里是firstTable,还有foreign_key secondTable_id