【问题标题】:How to convert this SQL Select query to perform an update on a table value for the result set?如何转换此 SQL Select 查询以对结果集的表值执行更新?
【发布时间】:2020-05-26 14:12:55
【问题描述】:

下面的查询正确地给了我一个启用的可配置项目的列表,其中所有相关的简单项目都被禁用。对于此列表中的可配置项目,我如何修改它以将“状态”属性值更新为“2”。 (它们没有子项,因此需要禁用)

感谢我将表命名和引用方法混合在一起。我是新手,并且结合了不同解决方案的元素。

SELECT `mgic_catalog_product_entity`.`entity_id` FROM  (((`mgic_eav_attribute`
  join `mgic_catalog_product_entity_int` on ((`mgic_eav_attribute`.`attribute_id` = `mgic_catalog_product_entity_int`.`attribute_id`)))
  join `mgic_catalog_product_entity` on ((`mgic_catalog_product_entity_int`.`entity_id` = `mgic_catalog_product_entity`.`entity_id`)))
  join `mgic_cataloginventory_stock_item` on ((`mgic_catalog_product_entity_int`.`entity_id` = `mgic_cataloginventory_stock_item`.`product_id`)))
WHERE `mgic_catalog_product_entity`.`type_id` = 'configurable' AND ((`mgic_eav_attribute`.`attribute_code` = 'status') and
  (`mgic_catalog_product_entity_int`.`value` = 2)) AND NOT EXISTS(
    SELECT *
    FROM mgic_catalog_product_super_link cpsl
    INNER JOIN mgic_catalog_product_entity_int cpei ON cpei.entity_id = cpsl.product_id
    WHERE 
      parent_id = `mgic_catalog_product_entity`.`entity_id`
      AND cpei.attribute_id = 97
      AND cpei.value = 1 
);

【问题讨论】:

标签: mysql sql magento magento2


【解决方案1】:

使用禁用的 simples 获取可配置项的 ID

由于status 属性的 id 始终为 97,您可以使用以下 SQL:

SELECT entity_id FROM `catalog_product_entity` cpe
WHERE `type_id` = 'configurable' AND NOT EXISTS(
    SELECT *
    FROM catalog_product_super_link cpsl
    INNER JOIN catalog_product_entity_int cpei ON cpei.entity_id = cpsl.product_id
    WHERE 
      parent_id = cpe.entity_id
      AND cpei.attribute_id = 97
      AND cpei.value = 1
);

按 ID 禁用产品

要回答您更新的问题,我建议您获取所有实体 ID,然后使用 Magento 模型更改每个产品的状态,就像这里建议的 https://magento.stackexchange.com/questions/152263/how-to-disable-enable-a-product-programatically-in-magento2 一样。 例如:

<?php
class Example
{
    /**
     * @var \Magento\Catalog\Model\ProductRepository
     */
    protected $productRepository;

    /**
     * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
     */
    protected $productCollectionFactory;

    /**
     * @param \Magento\Catalog\Model\ProductRepository $productRepository
     */
    public function __construct(
        \Magento\Catalog\Model\ProductRepository $productRepository,
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
    ) {
        $this->productRepository = $productRepository;
        $this->productCollectionFactory = $productCollectionFactory;
    }

    /**
     * Disable all products by IDs
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function disableProducts($productIds)
    {
        $productCollection = $this->productCollectionFactory()->create();
        $productCollection->addAttributeToFilter('type_id', array('eq' => 'configurable'))
            ->setPageSize(999);

        $productCollection->getSelect()
            ->where('NOT EXISTS(
                    SELECT *
                    FROM catalog_product_super_link cpsl
                    INNER JOIN catalog_product_entity_int cpei ON cpei.entity_id = cpsl.product_id
                    WHERE 
                      parent_id = e.entity_id
                      AND cpei.attribute_id = 97
                      AND cpei.value = 1
                )');
        foreach ($productCollection as $p) {
            $product = $this->productRepository->getById(
                $p->getId(),
                true /* edit mode */,
                0 /* global store*/,
                true/* force reload*/
            );
            $product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
            $this->productRepository->save($product);
        }
    }
}

【讨论】:

  • 谢谢,我用过这个,非常有帮助。我更新了我的问题以获得我想要的最终结果。你能帮忙吗?
  • 如何指定SQL查询的结果集作为获取ProductIds的依据?另外,我对这个方法不熟悉,如何启动这个功能?
  • 我更新了我的示例。你可以看到它使用 Magento 集合来选择所有可配置的产品,然后遍历集合以禁用每个产品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多