1

バックエンド モジュールの場合、製品 ID が有効かどうかを確認する必要があります。つまり、その ID を持つ製品はありますか? そのための2つの解決策を見つけましたが、どちらにもあまり満足していません:

  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

ベンマークジェームズに感謝します。あなたは私を正しい方向に向けてくれました。私はあなたのアプローチを組み合わせました:

$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 を int ではなく文字列として返しますが、それで問題ありません。

于 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 に答える