Yii的。 CActiveDataProvider和很多关系

时间:2016-09-29 23:14:07

标签: php yii has-many cgridview cactivedataprovider

我有两个模型:文档和报告。一份文件可以有0或几份报告。一份报告属于0或1份文件。

class Document extends CActiveRecord {
    public function relations() {
        return array(
            'reports' => array(self::HAS_MANY, 'Report', 'document_id')
        );
    }
}

class Report extends CActiveRecord {
    public function relations() {
        return array(
            'document' => array(self::BELONGS_TO, 'Document', 'document_id')
        );
    }
}

field document_id可以为null。

我想使用CGridView小部件显示表格。表包含“文档名称”和“报告名称”列。如果文件没有报告只放“文件名”并保持“报告名”空白。如果文档有一个或多个报告,则为每个报告放置一行。例如:

+--------+-------------+
|Doc name| Report name |
+--------+-------------+
|doc1    |             |
|doc2    | report1     |
|doc3    | report2     |
|doc3    | report3     |
+--------+-------------+

当我尝试以这种方式创建CActiveDataProvider时:

$criteria = new CDbCriteria();
$criteria->with = [
    'reports' => [
       'together' => true,
]
$params = [
    'criteria' => $criteria,
];
$dataProvider = new CActiveDataProvider('Document', $params);

对于每个文档,我得到1行,即使文档有多个报告。

如果我这样做:

$criteria = new CDbCriteria();
$params = [
    'criteria' => $criteria,
];
$criteria->with = [
    'document' => [/*...*/],
]
$dataProvider = new CActiveDataProvider('Report', $params);

缺少包含0个报告的文档。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

使用CSqlDataProvider而不是CActiveDataProvider解决。