对于后端模块,我需要检查产品ID是否有效,即:是否有带有该ID的产品?我找到了两个解决方案,但我对其中任何一个都不满意:
Directy查询catalog_product_entity
表。非常快,但绝对不是很优雅,我担心可能会有我不知道的问题。
使用以下代码:
$product = Mage::getModel('catalog/product')->load($productID)
if ($product->getId()) {
//valid id
}
else {
//not a valid id
}
这应该可行,但速度很慢,因为我必须一次检查几个ID。由于我不需要实际的产品数据,因此加载它并没有多大意义。
有什么更好的建议吗?
答案 0 :(得分:5)
$productIds = array(16,17,18,19,290993,25 /*...*/);
$collection = Mage::getResourceModel('catalog/product_collection');
$collection->addFieldToFilter('entity_id',array('in'=>$productIds))->load();
$foundIds = array_intersect($productIds,array_keys($collection->toArray()));
var_dump($foundIds); /* each array value should be a valid ID */
答案 1 :(得分:3)
感谢benmarks和james,您指出了我正确的方向,我只是将您的方法结合起来:
$productIds = array(16,17,18,19,290993,25 /*...*/);
$collection = Mage::getResourceModel('catalog/product_collection');
$collection->addFieldToFilter('entity_id',array('in'=>$productIds));
$foundIds = $collection->getAllIds();
var_dump($foundIds); /* each array value should be a valid ID */
出于某种原因,getAllIds()将Ids作为字符串而不是整数返回,但这没关系。
答案 2 :(得分:2)
试试这个:
$collection->getAllIds();
您将获得所有产品ID的数组,然后您可以执行in_array
检查有效性。看看
Mage_Catalog_Model_Resource_Product_Collection
看看它是如何完成的。
修改强>
示例:
function isProductIdValid($productId)
{
// Allows model overrides (other modules) to work correctly.
// Returns all valid IDs
$collection = Mage::getModel('catalog/product')->getCollection();
$productIds = $collection->getAllIds();
if (in_array($productId, $productIds)) {
return true;
} else {
return false;
}
}
答案 3 :(得分:0)
为了让它快速,原始查询对我来说绝对是最快的: - )
但是也许预加载所有这样的id会有所帮助吗?
$collection = Mage::getModel('catalog/product')->getCollection()->getSelect()->reset(Zend_Db_Select::COLUMNS)->columns(array('entity_id'));
$ids = array();
foreach ($collection as $product) {
$ids[] = $product->getId();
}
然后,如果存在id,您可以使用in_array方法进行测试。