2015-05-05 1 views
6

Модель Поиск:yii2 GridView не показывает все соединения слева значения с помощью hasMany retionship

$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 

Просьба предоставить решения для устранения этой проблемы.

ответ

2

Что вы видите, это предполагаемое поведение: обычно вы не хотите, чтобы ваш запрос ActiveRecord содержал повторяющиеся первичные записи, поэтому Yii фильтрует любые дубликаты, вызванные JOIN. Вы можете видеть это поведение, определенное здесь: https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveQuery.php#L220

Поскольку вы хотите по существу отображать необработанные результаты, сгенерированные SQL с помощью JOIN (по одной строке для каждой комбинации страны и штата), я думаю, что наиболее прагматичное решение было бы использовать SqlDataProvider вместо ActiveDataProvider.

Это должно вернуть именно то, что вы хотите:

$query = Countries::find()->joinWith(['states'], false)->select(*); 

$dataProvider = new SqlDataProvider([ 
    'query' => $query->createCommand()->getRawSql(),   
]);   
1

Ответ дается laszlovl работает хорошо, но нужно изменить значение ключа «запроса» на «SQL», как показано ниже:

$query = Countries::find()->joinWith(['states'], false)->select(*); 

$dataProvider = new SqlDataProvider([ 
    'sql' => $query->createCommand()->getRawSql(),   
]); 

Из Yii 2 Docs мы можем найти, что свойство $ sql получает оператор SQL, который будет использоваться для выборки строк данных. Значение по умолчанию этого свойства является «нулевым»

0

Если вы явно указать выбранные столбцы с помощью метода select(), вы можете достичь того же результата, не мешая с сырым SQL запросов

$query->select(['countries.*','states.*']);