2015-05-05 9 views
6

Girl Cerca:yii2 GridView non mostrando tutta la sinistra si uniscono i valori utilizzando 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; 
} 

Modello:

public function getStates() 
{ 
    return $this->hasMany(States::className(), ['state_id' => 'state_id']); 
} 

devo comportare come

Id  Country  State 
1  India  State 1 
2  India  State 2 
3  India  State 3 
4  USA   USA State1 
5  USA   USA State2 

Quando sto usando gridview Sto ottenendo il seguente risultato

Id  Country  State 
1  India  State 1 
4  USA   USA State1 

Si prega di fornire soluzioni per risolvere questo problema.

risposta

2

Quello che viene visualizzato è il comportamento previsto: normalmente non si desidera che la query di ActiveRecord contenga record primari duplicati, quindi Yii filtra eventuali duplicati causati da JOIN. Puoi vedere questo comportamento definito qui: https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveQuery.php#L220

Dato che quello che vuoi è essenzialmente visualizzare i risultati grezzi come generato dall'SQL con un JOIN (una riga per ogni combinazione di Paese e Stato), penso che la soluzione più pragmatica sarebbe utilizzare SqlDataProvider anziché ActiveDataProvider.

Ciò dovrebbe restituire esattamente quello che vuoi:

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

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

La risposta data da laszlovl funziona bene, ma ha bisogno di cambiare il valore della chiave 'query' da 'SQL' come di seguito:

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

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

Da Yii 2 Docs possiamo trovare che $ sql proprietà ottiene l'istruzione SQL da utilizzare per il recupero delle righe di dati. Il valore predefinito di questa proprietà è "nullo"

0

Se si specifica in modo esplicito le colonne selezionate utilizzando il metodo select(), è possibile ottenere lo stesso risultato, senza fare confusione con SQL prime interroga

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