11

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

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

4

7 回答 7

22

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

(几乎所有 Magento 集合都继承的Mage_Core_Model_Resource_Db_Collection_Abstract集合模型)没有count()定义,所以count在你的集合上使用你很可能最终会得到Varien_Data_Collection::count()一个非常糟糕的选择,因为它会执行一个集合load()然后计算加载的对象:

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

拥有大量集合(尤其是 EAV 集合)将导致加载所有集合数据 - 这可能需要很多时间。

相反,您应该使用Varien_Data_Collection_Db::getSize()方法,该方法将运行 SQL 查询以仅获取计数,与检索所有类型的数据以进行 Collection 加载相比优化得多:

/**
 * 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().

所以正确答案应该是:

$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->getSize());
于 2013-03-11T17:07:42.843 回答
4

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

if (!$datas->getData() || empty($datas->getData())) {
     // do things
}
于 2013-03-11T15:53:02.980 回答
3

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

测试了 750 种产品

$collection->getData()

  • 总含 挂壁时间(微秒):67,567 微秒
  • 总含 CPU(微秒):67,599 微秒
  • 总含 内存使用(字节):11,719,168 字节
  • 总含 PeakMemUse(字节):11,648,152 字节
  • 函数调用次数:1,047

$collection->getSize()

  • 总含 挂壁时间(微秒):6,371 微秒
  • 总含 CPU(微秒):4,402 微秒
  • 总含 内存使用(字节):140,816 字节
  • 总含 PeakMemUse(字节):96,000 字节
  • 函数调用次数:191

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

  • 总含 挂壁时间(微秒):2,130,568 微秒
  • 总含 CPU(微秒):2,080,617 微秒
  • 总含 内存使用(字节):12,899,872 字节
  • 总含 PeakMemUse(字节):13,002,256 字节
  • 函数调用次数:101,073

所以你应该去getSize()


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

于 2017-07-22T20:59:44.630 回答
2

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

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

where /** * Retireve count of collection loaded items * * @return int */ public function count()

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

于 2013-03-11T17:00:21.520 回答
1

您可以使用;

$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->count());
于 2013-03-11T15:52:44.353 回答
1

count()在集合上运行一个简单的标准 PHP就可以了。只要您正确过滤了您的集合,在计算它之前您应该始终这样做,调用->count()集合上的方法也可以。只要您以任何方式操作集合,无论您使用哪种方法,它都会加载,因此标准 PHPcount()调用->count()对象上的方法,使用 a 运行集合,foreach()所有加载集合的方式与load(),事实上,如果你追溯这个load()方法,你会发现它实际上运行了一个标准的 PHPforeach()来加载集合数据。

所以不管你怎么做,你仍然不能计算你的集合,直到你知道从数据库返回了多少结果,所以上面的方法很好,但确实意味着额外的数据库调用,首先要计算,然后加载。更好的方法是通过使用子句等来缩小陈述的范围,以确保您的SELECT陈述尽可能具体。WHERE如果您从集合中拉取选择对象,您可以访问此处显示的所有 Zend_Db_Select 方法,即

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

于 2013-03-11T17:59:37.757 回答
0

假设产品集合是 $pro_collection

现在应用以下代码..

<?php 
if(isset($pro_collection) && count($pro_collection) > 0) {
    /* Your code here */
}
?>
于 2014-08-28T07:16:19.493 回答