1

我有两个模型:文档和报告。一份文档可能有 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')
        );
    }
}

字段 document_id 可以为空。

我想使用 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 个报告的文档。

我怎样才能做到这一点?

4

1 回答 1

0

使用 CSqlDataProvider 而不是 CActiveDataProvider 解决。

于 2016-09-30T14:18:41.790 回答