1

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

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

  2. 使用以下代码:

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

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

有更好的建议吗?

4

4 回答 4

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 */
于 2012-12-19T17:42:54.813 回答
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() 将 Id 作为字符串而不是整数返回,但这很好。

于 2012-12-20T17:37:21.920 回答
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;
    }
}
于 2012-12-19T18:22:07.630 回答
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 方法进行测试。

于 2012-12-19T17:44:34.313 回答