4

I am trying to update a product with some custom attributes. I need to unset data that is being passed to set the value to none. I am currently on Magento 2.1

... 
 $updatedProduct->unsetData($customAttributeA);
 $updatedProduct->save();

I added a break-point after unset the data, customAttributeA row is indeed gone from the product data array. However, after calling the save function, customAttributeA comes back into the array, with the value previously set.

Is there a way to persist the unsetData during the save function? I have also tried

$product->setData($customAttributeA , "");
And
$product->setCustomAttribute($customAttributeA , "");

However, none of them seems to work.

The attribute type i am trying to unset is a dropdown type.

Cheers

edit- this is a snapshot of the code i am using to set/unset the data

 foreach ($listTypes as $key => $value) {
    if (isset($params[$value])){
       if(isset($params[$value . '_mid'])) {
           $product->setCustomAttribute($value, $params[$value.'_mid']);
       }else{     
           // unset data here
       }
    }
 }

 $product->save();
2
  • Any ideas anyone? I'm wasting a lot of time trying various methods but nothing seems to work.
    – Derek
    Commented Dec 16, 2016 at 4:01
  • just to update, whoever comes across this issue in the future. I've given up doing this via the product model, i am directly querying the database tables to remove the option-value row directly.
    – Derek
    Commented Dec 16, 2016 at 9:30

3 Answers 3

3

I found this one https://stackoverflow.com/a/8672847. It looks like Magento 1 code but it's work for me.

$product->setData('unwanted_attribute',null);        
$resource = $product->getResource();
$resource->saveAttribute($product,'unwanted_attribute');
0

You have to try with below for unset data,

1st way

You have to use setData() instead of unsetData() for unset data.

$updatedProduct->setData($customAttributeA);
$updatedProduct->save();

2nd Way,

unset($customAttributeA);
4
  • Thanks for the reply Rakesh. i tried the 1st way, it does have the same behavior as the methods i used previously. It sets the attribute value to null, however, it doesn't persist through the save method. And the second method, doesn't seem to affect anything though ( I used $updatedProduct->unset($customAttributeA);
    – Derek
    Commented Dec 13, 2016 at 5:58
  • I just understood your 2nd method, i'll try it again soon
    – Derek
    Commented Dec 13, 2016 at 7:50
  • Is it useful in your case? Commented Dec 13, 2016 at 8:33
  • I just tried, nope, method 2 does not work as well unfortunately.
    – Derek
    Commented Dec 13, 2016 at 8:34
0

I could not find a way to unset a custom attribute on a product, so I removed the record from the database instead. Below is the code if anyone is interested.

private function unsetCustomAttribute($magentoProduct, $attributeCode)
{
    $this->logger->debug("Unset custom attribute '" . $attributeCode . "' on product '" . $magentoProduct->sku . "'");

    /** @var ProductAttributeRepositoryInterface $attributeRepository */
    $attributeRepository = ObjectManager::getInstance()->get(ProductAttributeRepositoryInterface::class);
    $attribute = $attributeRepository->get($attributeCode);

    /** @var ResourceConnection $resources */
    $resources = ObjectManager::getInstance()->get(ResourceConnection::class);

    /** @var AdapterInterface $connection */
    $connection = $resources->getConnection();
    $connection->delete("catalog_product_entity_int", "entity_id = " . $magentoProduct->id . " AND attribute_id = " . $attribute->getAttributeId());
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.