检测集合是否包含数据

时间:2013-03-11 15:44:50

标签: magento

这可能是一个简单的问题,但我找不到答案。我怎么知道我的收藏是否没有数据?

我做$datas = Mage::getModel('zzz/zzz')->getCollection()如果我执行$datas->getData()它会返回一个空数组,但是如果不执行foreach或getData,我如何知道我的集合是否没有数据?

7 个答案:

答案 0 :(得分:21)

您应该避免使用count或您的收藏集。原因如下:

Mage_Core_Model_Resource_Db_Collection_Abstract(几乎所有Magento馆藏继承的馆藏模型)没有定义count(),因此在您的馆藏中使用count,您最有可能最终获得{ {1}}这是非常糟糕的选择,因为它执行集合Varien_Data_Collection::count()然后计算加载的对象:

load()

拥有大量收藏(尤其是EAV收藏)会导致加载所有收藏数据 - 这可能需要很长时间。

相反,您应该使用/** * Retireve count of collection loaded items * * @return int */ public function count() { $this->load(); return count($this->_items); } 方法,该方法将运行SQL查询以仅计数,与检索Collection load的所有类型的数据相比,更加优化:

Varien_Data_Collection_Db::getSize()

除此之外,无法以任何方式修改/** * 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后,您将无法在任何时候应用更改排序顺序的其他过滤器。

所以正确答案应该是:

count()

答案 1 :(得分:4)

您可以轻松地执行if语句:

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

答案 2 :(得分:3)

除了接受的答案外,请参阅基准:

经过750种产品的测试

$collection->getData()

  • Total Incl。壁时间(微秒):67,567微秒
  • Total Incl。 CPU(微秒):67,599微秒
  • Total Incl。 MemUse(字节):11,719,168字节
  • Total Incl。 PeakMemUse(字节):11,648,152字节
  • 函数调用次数:1,047

$collection->getSize()

  • Total Incl。壁时间(微秒):6,371微秒
  • Total Incl。 CPU(微秒):4,402微秒
  • Total Incl。 MemUse(字节):140,816字节
  • Total Incl。 PeakMemUse(字节):96,000字节
  • 函数调用次数:191

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

  • Total Incl。壁时间(微秒):2,130,568微秒
  • Total Incl。 CPU(微秒):2,080,617微秒
  • Total Incl。 MemUse(字节):12,899,872字节
  • Total Incl。 PeakMemUse(字节):13,002,256字节
  • 函数调用次数:101,073

所以你应该选择getSize()

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

答案 3 :(得分:2)

/ **      *检索收集所有项目计数      *      * @return int      * / $ collection = Mage :: getModel('aaa / bbb') - > getCollection() - > getSize();

这是在分页等中使用的代码,建议使用。

,其中  / **      * Retireve收集物品的数量      *      * @return int      * /     公共职能计数()

将有助于检查已加载的项目数据。

答案 4 :(得分:1)

你可以使用;

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

答案 5 :(得分:1)

在这个集合上运行一个简单的标准PHP count()就好了。只要你已经正确地过滤了你的集合,你应该在到达计数点之前总是这样做,它也可以调用集合上的->count()方法。只要您以任何方式操作集合,无论您使用何种方法,它都会加载,因此标准PHP count()在对象上调用->count()方法,使用{运行集合{1}}将以与foreach()相同的方式加载集合,事实上,如果您追溯load()方法,您将看到它实际上运行标准PHP load()到加载数据。

因此,无论你怎么做,在你知道从数据库返回了多少结果之前,你仍然无法计算你的收藏,所以上面的方法很好,但是这意味着额外的数据库调用,首先计数,然后加载。更好的方法是确保通过使用foreach()子句缩小它们来尽可能使SELECT语句尽可能具体。如果从集合中提取select对象,则可以访问所有显示here的Zend_Db_Select方法,即

WHERE

答案 6 :(得分:0)

假设产品系列是$ pro_collection

现在应用以下代码..

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