这可能是一个简单的问题,但我找不到答案。我怎么知道我的收藏是否没有数据?
如果我$datas = Mage::getModel('zzz/zzz')->getCollection()
执行$datas->getData()
它会返回一个空数组,但是如果不执行 foreach 或 getData ,我怎么知道我的集合是否没有数据?
这可能是一个简单的问题,但我找不到答案。我怎么知道我的收藏是否没有数据?
如果我$datas = Mage::getModel('zzz/zzz')->getCollection()
执行$datas->getData()
它会返回一个空数组,但是如果不执行 foreach 或 getData ,我怎么知道我的集合是否没有数据?
您应该避免使用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());
您可以像这样轻松地执行 if 语句:
if (!$datas->getData() || empty($datas->getData())) {
// do things
}
除了接受的答案外,请参阅基准:
测试了 750 种产品
$collection->getData()
$collection->getSize()
$collection->count()
或者sizeof($collection)
所以你应该去getSize()
。
/** * 检索集合的所有项目计数 * * @return int */ $collection = Mage::getModel('aaa/bbb')->getCollection()->getSize();
这是用于分页等的代码,建议使用。
where /** * Retireve count of collection loaded items * * @return int */ public function count()
将有助于检查加载的项目数据。
您可以使用;
$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->count());
count()
在集合上运行一个简单的标准 PHP就可以了。只要您正确过滤了您的集合,在计算它之前您应该始终这样做,调用->count()
集合上的方法也可以。只要您以任何方式操作集合,无论您使用哪种方法,它都会加载,因此标准 PHPcount()
调用->count()
对象上的方法,使用 a 运行集合,foreach()
所有加载集合的方式与load()
,事实上,如果你追溯这个load()
方法,你会发现它实际上运行了一个标准的 PHPforeach()
来加载集合数据。
所以不管你怎么做,你仍然不能计算你的集合,直到你知道从数据库返回了多少结果,所以上面的方法很好,但确实意味着额外的数据库调用,首先要计算,然后加载。更好的方法是通过使用子句等来缩小陈述的范围,以确保您的SELECT
陈述尽可能具体。WHERE
如果您从集合中拉取选择对象,您可以访问此处显示的所有 Zend_Db_Select 方法,即
$collection->getSelect()->where('......... = ?', $var);
假设产品集合是 $pro_collection
现在应用以下代码..
<?php
if(isset($pro_collection) && count($pro_collection) > 0) {
/* Your code here */
}
?>