У меня есть две модели: документ и отчет. Один документ может иметь от 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 отчетами отсутствуют.
Как я могу это сделать?
Решено с использованием CSqlDataProvider вместо CActiveDataProvider.
Других решений пока нет …