2015-05-05 21 views
6

Model Search kullanarak değerleri katılmak: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; 
} 

Modeli: Ben kullanıyorum zaman

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

gibi neden ihtiyaç

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

gridview Aşağıdaki sonuca gidiyorum

Id  Country  State 
1  India  State 1 
4  USA   USA State1 

Lütfen bu sorunu gidermek için çözümler verin.

cevap

2

Gördüğünüz amaçlanan davranış: normalde ActiveRecord sorgunuzun yinelenen birincil kayıtları içermesini istemezsiniz, dolayısıyla Yii, JOIN'lerin neden olduğu tüm kopyaları filtreler. Burada tanımlanan davranışı burada görebilirsiniz: https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveQuery.php#L220

Asıl istediğiniz şey SQL tarafından oluşturulan ham sonuçları bir JOIN (her bir Ülke ve Ülke birleşimi için bir satır) ile göstermek, en pragmatik çözüm olduğunu düşünüyorum. ActiveDataProvider yerine SqlDataProvider kullanmak olacaktır.

İstediğin tam olarak dönmelidir:

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

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

laszlovl verdiği cevap iyi çalışır, ancak aşağıda gibi 'sql' ile 'sorgu' tuşuna değerini değiştirmek gerekir:

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

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

Yii 2 Docs'dan, $ sql özelliğinin, veri satırları almak için kullanılacak SQL deyimini aldığını bulabiliriz. Bu özelliğin varsayılan değeri "sıfır"

0

açıkça select() yöntemi kullanılarak seçilen sütunları belirtirseniz, çiğ sql ile karışıklık olmadan, aynı sonucu elde edebilirsiniz olduğu

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