коде с 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"