这可能是一个简单的问题,但我无法找到答案。 我怎么能知道我的收藏有没有数据?
我做$datas = Mage::getModel('zzz/zzz')->getCollection()
如果我做了$datas->getData()
返回一个空数组,但我怎么知道我的收藏中没有数据,而不这样做的foreach或的getData?
这可能是一个简单的问题,但我无法找到答案。 我怎么能知道我的收藏有没有数据?
我做$datas = Mage::getModel('zzz/zzz')->getCollection()
如果我做了$datas->getData()
返回一个空数组,但我怎么知道我的收藏中没有数据,而不这样做的foreach或的getData?
您应该避免使用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());
您可以轻松地只是做一个if语句,像这样:
if (!$datas->getData() || empty($datas->getData())) {
// do things
}
除了公认的答案见基准测试:
测试750个产品
$collection->getData()
$collection->getSize()
$collection->count()
或sizeof($collection)
所以,你应该用去getSize()
形式: https://magento.stackexchange.com/questions/179028/how-to-check-if-a-collection-has-items/179035#179035
/ ** *检索集合中的所有项目数* * @返回INT * / $集合=法师:: getModel( 'AAA / BBB') - > getCollection() - >的getSize();
这是在分页等使用,并建议代码。
其中,/ ** *集装物品* * @返回INT * /公共职能计数Retireve数()
将检查加载的项目有用的数据。
您可以使用;
$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->count());
运行一个简单的,标准的PHP count()
的集合是在这里很好。 只要你有适当过滤你的收藏,你应该始终有越来越来计算它调用点之前完成->count()
方法的集合是罚款也。 只要你操作的集合中的任何方式,它会不管你使用的方法,所以一个标准的PHP的装载count()
调用->count()
的对象的方法,通过收集与正在运行foreach()
将加载所有集合中相同的方式,为load()
如果您跟踪事实load()
方法后面,你会看到它实际上是运行在标准的PHP foreach()
来加载收集数据。
因此,它不会不管你怎么做,你还是直到你知道有多少结果已经从数据库返回,因此上述方法是好的不能指望你的收藏,但并不意味着额外的DB调用,首先来算,然后加载。 更好的方法是只是为了确保你让你的SELECT
通过缩小他们的语句尽可能具体WHERE
子句等。 如果从集合拉选择对象,你必须对所有显示的Zend_Db_Select对象方法访问这里 ,即
$collection->getSelect()->where('......... = ?', $var);
假设该产品集为$ pro_collection
现在应用下面的代码..
<?php
if(isset($pro_collection) && count($pro_collection) > 0) {
/* Your code here */
}
?>