коде с Yii2 GridView не показывает все левое соединение значения с помощью retionship помощью методов hasmany
Поиск Модели :
$query = Countries::find()->joinWith(['states']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'defaultOrder' => ['doc_date'=>SORT_DESC],
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
модель :
public function getStates()
{
return $this->hasMany(States::className(), ['state_id' => 'state_id']);
}
мне нужен результат, как
Id Country State
1 India State 1
2 India State 2
3 India State 3
4 USA USA State1
5 USA USA State2
когда я использую gridview, я получаю следующий результат
Id Country State
1 India State 1
4 USA USA State1
пожалуйста, дайте решения для устранения этой проблемы.
3 ответов
то, что вы видите, - это предполагаемое поведение: обычно вы не хотите, чтобы ваш запрос ActiveRecord содержал дубликаты первичных записей, поэтому Yii отфильтровывает любые дубликаты, вызванные соединениями. Вы можете увидеть это поведение, определенное здесь: https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveQuery.php#L220
поскольку вы хотите, по существу, отображать необработанные результаты, созданные SQL с помощью соединения (по одной строке для каждой комбинации страны и состояния), I думаю, самым прагматичным решением было бы использовать SqlDataProvider
вместо ActiveDataProvider
.
Это должно вернуть именно то, что вы хотите:
$query = Countries::find()->joinWith(['states'], false)->select(*);
$dataProvider = new SqlDataProvider([
'sql' => $query->createCommand()->getRawSql(),
]);
Если явно указать выбранные столбцы с помощью select()
метод, вы можете добиться того же результата, не возиться с raw SQL-запросов
$query->select(['countries.*','states.*']);
ответ, данный laszlovl, работает хорошо, но необходимо изменить значение ключа "query" на "sql", как показано ниже:
$query = Countries::find()->joinWith(['states'], false)->select(*);
$dataProvider = new SqlDataProvider([
'sql' => $query->createCommand()->getRawSql(),
]);
С Yii 2 Docs мы можем найти, что свойство $sql получает оператор SQL, который будет использоваться для извлечения строк данных. По умолчанию это свойство имеет значение "null"