检查产品ID在magento中是否有效的最佳方法是什么?

时间:2012-12-19 17:24:30

标签: php magento magento-1.7

对于后端模块,我需要检查产品ID是否有效,即:是否有带有该ID的产品?我找到了两个解决方案,但我对其中任何一个都不满意:

  1. Directy查询catalog_product_entity表。非常快,但绝对不是很优雅,我担心可能会有我不知道的问题。

  2. 使用以下代码:

    $product = Mage::getModel('catalog/product')->load($productID)
    if ($product->getId()) {
      //valid id
    }
    else {
      //not a valid id
    }
    

    这应该可行,但速度很慢,因为我必须一次检查几个ID。由于我不需要实际的产品数据,因此加载它并没有多大意义。

  3. 有什么更好的建议吗?

4 个答案:

答案 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)

感谢benmarksjames,您指出了我正确的方向,我只是将您的方法结合起来:

$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方法进行测试。