检测是否集合包含数据(Detect if collection contains data)

2019-08-17 11:18发布

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

我做$datas = Mage::getModel('zzz/zzz')->getCollection()如果我做了$datas->getData()返回一个空数组,但我怎么知道我的收藏中没有数据,而不这样做的foreach或的getData?

Answer 1:

您应该避免使用count或您的收藏。 这是因为:

Mage_Core_Model_Resource_Db_Collection_Abstract (即几乎所有的Magento继承收藏集模型)没有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查询来获取只计算,比检索所有种类的收集负载数据的更优化:

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


Answer 2:

您可以轻松地只是做一个if语句,像这样:

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


Answer 3:

除了公认的答案见基准测试:

测试750个产品

$collection->getData()

  • 总计已包含。 挂钟时间(微秒):67567微秒
  • 总计已包含。 CPU(微秒):67599微秒
  • 总计已包含。 MemUse(字节):11719168个字节
  • 总计已包含。 PeakMemUse(字节):11648152个字节
  • 函数的调用数:1047

$collection->getSize()

  • 总计已包含。 挂钟时间(微秒):6,371微秒
  • 总计已包含。 CPU(微秒):4402微秒
  • 总计已包含。 MemUse(字节):140816个字节
  • 总计已包含。 PeakMemUse(字节):96000个字节
  • 函数的调用数:191

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

  • 总计已包含。 挂钟时间(微秒):2130568微秒
  • 总计已包含。 CPU(微秒):2080617微秒
  • 总计已包含。 MemUse(字节):12899872个字节
  • 总计已包含。 PeakMemUse(字节):13002256个字节
  • 函数的调用数:101073

所以,你应该用去getSize()


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



Answer 4:

/ ** *检索集合中的所有项目数* * @返回INT * / $集合=法师:: getModel( 'AAA / BBB') - > getCollection() - >的getSize();

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

其中,/ ** *集装物品* * @返回INT * /公共职能计数Retireve数()

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



Answer 5:

您可以使用;

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


Answer 6:

运行一个简单的,标准的PHP count()的集合是在这里很好。 只要你有适当过滤你的收藏,你应该始终有越来越来计算它调用点之前完成->count()方法的集合是罚款也。 只要你操作的集合中的任何方式,它会不管你使用的方法,所以一个标准的PHP的装载count()调用->count()的对象的方法,通过收集与正在运行foreach()将加载所有集合中相同的方式,为load()如果您跟踪事实load()方法后面,你会看到它实际上是运行在标准的PHP foreach()来加载收集数据。

因此,它不会不管你怎么做,你还是直到你知道有多少结果已经从数据库返回,因此上述方法是好的不能指望你的收藏,但并不意味着额外的DB调用,首先来算,然后加载。 更好的方法是只是为了确保你让你的SELECT通过缩小他们的语句尽可能具体WHERE子句等。 如果从集合拉选择对象,你必须对所有显示的Zend_Db_Select对象方法访问这里 ,即

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



Answer 7:

假设该产品集为$ pro_collection

现在应用下面的代码..

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


文章来源: Detect if collection contains data
标签: magento