这可能是一个简单的问题,但我找不到答案。我怎么知道我的收藏是否没有数据?
我做$datas = Mage::getModel('zzz/zzz')->getCollection()
如果我执行$datas->getData()
它会返回一个空数组,但是如果不执行foreach或getData,我如何知道我的集合是否没有数据?
答案 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()
$collection->getSize()
$collection->count()
或sizeof($collection)
所以你应该选择getSize()
。
答案 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 */
}
?>