0

我有以下示例代码:

                $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)不可用。

任何人都可以就代码有什么问题或为什么“选择”选项没有选择第二个字段提供帮助吗?

4

2 回答 2

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 的关系名称。

于 2012-06-26T10:13:36.283 回答
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,并且外键secondTable_id

于 2012-06-27T06:24:44.517 回答