2015-01-12 15 views
10
'dan daha büyük veya daha az

geliştirme uygulamasını test ettiğim ülke veritabanı tablosum var (the guide'da bulundu). Alanım population var ve tüm belirli nüfus sınırlarını döndürmek için Country modelinde bir genel yöntem oluşturmak istiyorum. Yani tüm nüfuslu ülkeleri x ve y arasında döndürün. CountryController olarakyii2 BaseActiveRecord findAll() koşulları

// models/Country.php 
.... 

public function getPopulationBetween($lower, $upper) 
{ 
    return Country::findAll(['population' => [">=".$lower, "<=".$upper]]); 

} 

:

Aşağıdaki çalıştı

Boş bir dizi i döndürür
public function actionGetBetween($lower, $upper) 
    { 
     print_r(Country::getPopulationBetween($lower, $upper)); 
    } 

e Array()

Şimdi durumu nasıl ayarlanacağı bilmek gerekir 'un SQL koşulu gibi olması ... Where population >= 20000 AND population <= 40000000 örn. Bir diziyi kullanarak durumla karşılaştırma nasıl eklenir ?! findAll çağrılırken

başka yan -veya seçime bağlı bir soru, Country.php içinde aşağıdaki Neden gibidir: Bu hata verir

public function getPopulationBetween($lower, $upper) 
    { 
     return $this->findAll(['population' => [">=".$lower, "<=".$upper]]); 

    } 

: Başka bir deyişle

Unknown Method – yii\base\UnknownMethodException

Calling unknown method: app\controllers\CountryController::findAll()

neden bunu gerekir statik olarak mı adlandırıldı?

cevap

25

Oluşturulan SQL sorgusunu görmek için hata ayıklama modülünü kullanın. Senin durumunda

öyle olacak:

SELECT * FROM `countries` WHERE `population` IN ('>=20000', '<=40000000') 

sen kesinlikle yanlış görebileceğiniz gibi.

findAll() belgelerini kontrol edin, bu gibi durumlar için uygun değildir. Bunun yerine find()'u kullanın.

1) bu durumda alıntı ve kaçış uygulanacak olmayacak

public static function getPopulationBetween($lower, $upper) 
{ 
    return Country::find() 
     ->where(['and', "population>=$lower", "id<=$upper"]) 
     ->all(); 
} 

Not. Bu nesne örneği bağımlı olmadığından

2)

public static function getPopulationBetween($lower, $upper) 
{ 
    return Country::find() 
     ->where(['>=', 'population', $lower]) 
     ->andWhere(['<=', 'population', $upper]) 
     ->all(); 
} 

da static yöntemin beyan değiştirin.

where sorgu bölümünün nasıl oluşturulduğunu anlamak için lütfen resmi belgelerin this ve this bölümlerini okuyun.

Belki de bu yöntemi özelleştirilmiş sorgu sınıfına koymak daha iyidir. Bu konuda here okuyabilirsiniz.

Ek sorunuzun yanıtı: çerçeve tasarımına göre statik yöntem olduğundan, nesne bağlamında findAll() numaralı telefonu aramamalısınız.

edin yii\db\BaseActiveRecord:

public static function findAll($condition) 
+0

i) (bu '$ userDtls = Öğrenci :: modelini nasıl elde edebileceğini söyle lütfen edebilirsiniz -> findAllByAttributes (dizi ( 'id' => (patlayabilir", ", $ _POST ['studentIds']) )); yii2 –

+0

@MikeRoss' Öğrenci :: findAll (['id' => $ studentIds]); 'yeterli olmalıdır. Verilerin varlığını '$ _POST 'olarak kontrol etmeyi ve kullanmadan önce doğrulamayı unutmayın." $ _POST "dan gelen verilere asla güvenmemelisiniz. – arogachev

+0

Yani demek istediğim bu gibi bir şey yapmalıyım '$ id = $ _POST ['keylist']; $ result = Kullanıcılar :: findAll ($ id); '' fakat çalışmıyor ve hala sadece ilk veriyi aldım 'id' –