Yii CActiveDataProvider联接并从联接表中选择

Yii CActiveDataProvider联接并从联接表中选择,yii,Yii,我有以下示例代码: $dataProvider = new CActiveDataProvider('firstTable', array('criteria' => array( 'select' => 't.firstfield,secondTable.secondfield', 'join' => 'jo

我有以下示例代码:

                $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(来自模型表-firstTable)可用,但secondField(来自联接表-secondTable)不可用


是否有人可以就代码的错误或“选择”选项没有选择第二个字段的原因提供帮助?

如果您使用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\u relation是与secondTable的关系名称。

如果您使用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的关系名称

是否有人可以就代码的错误或“选择”选项未拾取第二个字段的原因提供帮助

答复: 这是因为您没有选择与两个表相关的字段,即firstTable:
secondTable\u 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
但是,当您访问第二个字段时,仍然会有另一个查询(延迟加载)。并且返回的初始(惰性之前)对象将不会填充第二个表对象

我认为问题在于,默认情况下,yii通过延迟加载访问相关字段,为此,相关的外键应该出现在您试图创建数据提供者的模型中,这里是firstTable,而外键
secondTable\u id

是否有人可以就代码的错误或“选择”选项未拾取第二个字段的原因提供帮助

答复: 这是因为您没有选择与两个表相关的字段,即firstTable:
secondTable\u 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
但是,当您访问第二个字段时,仍然会有另一个查询(延迟加载)。并且返回的初始(惰性之前)对象将不会填充第二个表对象


我认为问题在于,默认情况下,yii通过延迟加载访问相关字段,为此,相关外键应该出现在您试图创建数据提供者的模型中,这里是firstTable,外键
secondTable\u id

,我也同意onkarjanwa的观点,我也同意onkarjanwa的观点,使用