我有以下示例代码:
$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)不是。
任何人都可以提供有关代码错误或“选择”选项未获取第二个字段的原因的帮助吗?
答案 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
。