2013-03-11 3 views
9

Basit bir soru olabilir, ancak cevabı bulamıyorum. Koleksiyonumun veriye sahip olup olmadığını nasıl anlarım?Koleksiyonda veri bulunup bulunmadığının algılanması

$datas->getData() yaparsam $datas = Mage::getModel('zzz/zzz')->getCollection() yapıyorum, boş bir dizi döndürür, ancak koleksiyonumun foreach veya getData yapmadan veri olup olmadığını nasıl anlarım?

cevap

20

count veya Koleksiyonlarınızdan kaçınmalısınız.

Mage_Core_Model_Resource_Db_Collection_Abstract (hemen hemen tüm Magento Koleksiyonları tarafından devralınan Koleksiyon Modeli) bu yüzden büyük olasılıkla çok kötü seçenektir Varien_Data_Collection::count() ile bitireceğiz senin Koleksiyonu üzerinde count kullanarak, count() tanımlı yok bunun beri, İşte nedenleri: bir koleksiyon load() yapar ve daha sonra yüklenen nesneleri sayar:

/** 
* Retireve count of collection loaded items 
* 
* @return int 
*/ 
public function count() 
{ 
    $this->load(); 
    return count($this->_items); 
} 

senin Koleksiyon verilerinin TÜM yükleme sonucu yapacak geniş bir koleksiyona (özellikle EAV toplama) Having - Bu çok zaman alabilir. , Buna ek olarak

/** 
* Get collection size 
* 
* @return int 
*/ 
public function getSize() 
{ 
    if (is_null($this->_totalRecords)) { 
     $sql = $this->getSelectCountSql(); 
     $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams); 
    } 
    return intval($this->_totalRecords); 
} 

load sonra:

Bunun yerine sadece, çok daha Koleksiyon yükü için her türlü bilgiyi almak kıyasla optimize saymak almak için SQL sorgusu çalışacaktır Varien_Data_Collection_Db::getSize() yöntemi kullanmalıdır Koleksiyon hiçbir şekilde değiştirilemez. Örneğin, count() kullandıktan sonra herhangi bir noktada değişiklik sıralama düzenine ait ek filtreler uygulayamazsınız.

Yani doğru yanıt olmalıdır: koleksiyonunda basit, standart bir PHP count() Running

$collection = Mage::getModel('zzz/zzz')->getCollection(); 
var_dump($collection->getSize()); 
+0

Bu çok detaylı cevap için teşekkürler! Kabul edilmiş ! – Shadowbob

+0

Gerçekten bu cevabı işaretlemek istiyorum. ya da benim gibi değerli cevabı bu şekilde tutabileceğim profilime ekle. –

1

;

$collection = Mage::getModel('zzz/zzz')->getCollection(); 
var_dump($collection->count()); 
+0

İşe yaradı! Sayılabileceğimizi bilmiyordum. Bu harika teşekkürler. – Shadowbob

+2

@ user1682624, koleksiyonunuz ile 'count()' yöntemini kullanmaktan kaçınmalısınız. Neden benim postamda –

4

sadece bunu kolayca yapabilirsiniz if ifadesiyle şöyle:

if (!$datas->getData() || empty($datas->getData())) { 
    // do things 
} 
+0

'un altında olduğumu açıkladım. Bu, kaçınmak istediğim türden bir şeydi, cevap için +1. Teşekkürler. – Shadowbob

2

/** * tüm öğeleri * * @return int */ $ koleksiyonunu = Mage saymak koleksiyonunu al :: getModel ('aaa/bbb') -> getCollection() -> getSize();

Bu, sayfalandırmada kullanılan koddur ve önerilir. toplama yüklenen öğeleri /** * Retireve sayım * * @return int */ kamu fonksiyon sayısı()

yüklenen ürün verileri kontrol etmek faydalı olacaktır

.

1

burada gayet iyi. Koleksiyonunuzu düzgün bir şekilde filtrelediğiniz sürece, her zaman sayma noktasına gelmeden önce yapmanız gereken, ->count() yöntemini bir koleksiyona çağırmak da iyidir.Koleksiyonu herhangi bir şekilde manipüle ettiğinizde, kullandığınız yönteme bakılmaksızın yüklenir, böylece numaralı standart bir PHPyöntemini çağırır, foreach() ile koleksiyonun içinden geçirerek, koleksiyonun tümünü aynı şekilde yükler. load() gibi, aslında load() yöntemini geri izlerseniz, aslında toplama verilerini yüklemek için standart bir PHP foreach() çalışır.

Nasıl yaptığınız önemli değil, veritabanından kaç sonuç döndürdüğüne kadar hala koleksiyonunuzu sayamazsınız, bu nedenle yukarıdaki yöntem iyi, ancak fazladan DB çağrıları anlamına gelir, önce saymak, sonra yüklemek. Daha iyi bir yöntem, SELECT ifadelerinizi WHERE tümcecikleri ile daraltmak suretiyle mümkün olduğunca spesifik hale getirdiğinizden emin olmaktır. Eğer bir koleksiyondan seçme nesneyi çekin Eğer yani

$collection->getSelect()->where('......... = ?', $var);

+0

Aslında sadece 1 veri veya boş vermiş olurdu, bu yüzden bunu yapmanın en hızlı yolunu arıyordum. – Shadowbob

+0

Merhaba Jonathan, bu cevap için teşekkürler. Doğru tespit ettiğiniz gibi, koleksiyon sonunda yüklenecektir. Tek sorun şudur: çoğu zaman 'getSize' yi tanımlamak için kullanıyoruz, BİZ GERÇEKLEŞTİRMEK VEYA YÜKLEMEDE GEREKİYORUZ. "GetSize" in en tipik kullanımı - kontrol etmektir: koleksiyonumuz aslında nesneleri içerir ve ardından ya devam eder (eğer yaparsa) veya mantığınızı yürütmeden durdurur (böylece koleksiyon yüklenmeyecektir). Bunun yanı sıra, Koleksiyon bunu hazırlamak için birkaç farklı Modül tarafından kullanılabilir, bu yüzden 'saymak' diğerini kullanarak diğerinin mantığını kıracaktır (katalog araç çubuğuna bakın). –

0

..

ürün toplama $ pro_collection

Şimdi aşağıdaki kodu uygulamak olduğunu varsayalım, here gösterilen Zend_Db_Select yöntemlerinin tümüne erişebilirsiniz

Te: kabul cevaplara ek olarak

<?php 
if(isset($pro_collection) && count($pro_collection) > 0) { 
    /* Your code here */ 
} 
?> 
1

kriterler bkz 750 ürün

$collection->getData()

  • Toplam dahil

    için sted. Duvar Saati (microsec): 67,567 microsec
  • Toplam Dahil. CPU (mikroskolar): 67,599 microsecs
  • Toplam Dahil. MÜHENDİSLİK (bayt): 11,719,168 bayt
  • Toplam Incl. PeakMemUse (bayt): Fonksiyon 11648152 bayt
  • sayısı Aramalar: 1.047

$collection->getSize()

  • Toplam Incl. Duvar Saati (microsec): 6,371 microsecs
  • Toplam Dahil. CPU (mikroskolar): 4,402 microsec
  • Toplam Dahil. Memo (bayt): 140,816 bayt
  • Toplam Incl. PeakMemUse (bayt): Fonksiyon
  • sayısı Aramalar 96.000 bayt: 191

$collection->count() veya sizeof($collection)

  • Toplam Dahil. Duvar Saati (microsec): 2,130,568 mikroskobik
  • Toplam Dahil. CPU (mikroskolar): 2,080,617 mikroskobik
  • Toplam Dahil. Açıklama (bayt): 12,899,872 bayt
  • Toplam Incl.PeakMemUse (bayt): Fonksiyon
  • sayısı Aramalar 13002256 bayt:

101.073 Yani getSize() ile gitmeli.


Form: https://magento.stackexchange.com/questions/179028/how-to-check-if-a-collection-has-items/179035#179035