如何将此 SQL Select 查询转换为对结果集的 table 值执行更新?
How to convert this SQL Select query to perform an update on a table value for the result set?
下面的查询正确地为我提供了一个已启用的可配置项列表,其中禁用了所有相关的简单项。对于此列表中的可配置项,我如何修改它以将 'status' 属性值更新为“2”。 (他们没有子项,因此需要禁用)
感谢我将 table 命名和引用的方法混合在一起。我是新手,结合了不同解决方案的元素。
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
);
获取禁用简单的可配置项的 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);
}
}
}
下面的查询正确地为我提供了一个已启用的可配置项列表,其中禁用了所有相关的简单项。对于此列表中的可配置项,我如何修改它以将 'status' 属性值更新为“2”。 (他们没有子项,因此需要禁用)
感谢我将 table 命名和引用的方法混合在一起。我是新手,结合了不同解决方案的元素。
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
);
获取禁用简单的可配置项的 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);
}
}
}