Magento EAV:如何硬删除属性值?

Magento EAV:如何硬删除属性值?,magento,magento-1.4,magento-1.5,entity-attribute-value,Magento,Magento 1.4,Magento 1.5,Entity Attribute Value,在进入细节之前,让我们先问清楚这个问题: 是否有一种方法可以从产品中删除属性值? 我的意思是,从数据库中删除行,而不仅仅是将值设置为null或空 现在,详情如下: 我现在遇到了一个关于Magento的问题 我的商店中的许多产品都具有与产品无关的用户定义属性。例如,假设我们有一个包产品,以及其他产品,如t恤、连衣裙、裤子等: 我们的包产品只有一个可配置属性:颜色 我们的T恤产品有两个可配置属性:颜色和T恤尺寸 我们的服装产品有两个可配置属性:颜色和服装尺寸 我当前的问题是,当我从数据库检索我的

在进入细节之前,让我们先问清楚这个问题:


是否有一种方法可以从产品中删除属性值? 我的意思是,从数据库中删除行,而不仅仅是将值设置为null或空


现在,详情如下: 我现在遇到了一个关于Magento的问题

我的商店中的许多产品都具有与产品无关的用户定义属性。例如,假设我们有一个包产品,以及其他产品,如t恤、连衣裙、裤子等:

我们的包产品只有一个可配置属性:颜色

我们的T恤产品有两个可配置属性:颜色T恤尺寸

我们的服装产品有两个可配置属性:颜色服装尺寸

我当前的问题是,当我从数据库检索我的包产品时,我的产品中存储的属性是:颜色T恤尺寸连衣裙尺寸

我怀疑这是因为在我们的商店中,您可以更改产品的属性集(感谢FlagBit ChangeAttributeSet社区扩展)

我认为袋子产品是用一个特定的属性集创建的,然后有人将属性集更改为另一个,然后又更改了另一个。这将导致产品从其更改为的所有属性集中获取所有属性。但这只是一个想法,这可能是另一个原因。实际上,我目前并没有寻找导致我的产品具有不相关属性的具体原因

我今天想重置我的产品。重置是指删除与我的产品无关的属性。就我的包而言,这意味着删除tshirt\u sizedress\u size属性。删除意味着永远从对象中删除这些属性

我的问题是,我找不到怎么做。我尝试将属性设置为NULL并保存产品,但是当我再次查询产品时,我仍然会在数据中获取属性,并使用NULL值。我不希望属性值为null,我希望属性不存在

下面是一个代码示例,解释了我的一些尝试:

$product = Mage::getModel('catalog/product')->load(1234); //Let's assume that my bag product ID is 1234

Mage::log($product->getData());

/* This last line dump all my products datas and contains among other things:

[...]=>...
[color]=>3
[tshirt_size]=>34
[dress_size]=>45
[...]=>...

*/
如果我做了一件事:

$product->setData('tshirt_size',null);
$product->setData('dress_size',null);
$product->save();
然后再说一遍:

$product = Mage::getModel('catalog/product')->load(1234);
 Mage::log($product->getData());

    /* I get:

    [...]=>...
    [color]=>3
    [tshirt_size]=>null
    [dress_size]=>null
    [...]=>...

    */
我不想那样。我想:

/*

[...]=>...
[color]=>3
[...]=>...

*/
事实上,我的数组中仍然有条目,这意味着数据库中的实际行不会被删除。我想删除这些行

更令人沮丧的是,当我做一个

$product->getAttributes();
它返回可以设置为我的产品的所有属性,而不返回不相关的属性-这很有意义,因为不相关的属性不在我的产品的属性集中

因此,问题再次是:

是否有一种方法可以从产品中删除属性值? 我的意思是,从数据库中删除行,而不仅仅是将值设置为null或空

谢谢你的帮助

胡格斯


仅供参考:我正在使用Magento 1.6.1.0(但它并没有真正改变任何东西)

好的,我终于找到了它,在问了问题15分钟后(花了几个小时试图解决它)

答案如下:

$product = Mage::getModel('catalog/product')->load(1234); //Let's assume that my bag product ID is 1234
$product->setData('unwanted_attribute',null);    

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

编辑:这不起作用。如果您稍后通过执行
$product->save()
重新保存产品,则所有属性都会重新出现。您应该能够像以下任一操作那样取消设置该值:

$product->unsetData('unwanted_attribute')
        ->save();

$product->unsUnwantedAttribute()
        ->save();

您需要转到管理>>目录>>属性>>管理属性集 如果您试图管理您的产品目录,您应该首先考虑您的属性(独立于您的产品),然后考虑您的集合(同样不是您产品的一部分)。 正确建立属性和属性集后,可以将它们应用于具有每个属性值的产品

或者你更喜欢这种东西

class Mage_catalog_Model_Product_Attribute_Set_Api extends Mage_Api_Model_Resource_Abstract
{
 {
/**
 * Retrieve attribute set list
 *
 * @return array
 */
public function items()
{
    $entityType = Mage::getModel('catalog/product')->getResource()->getEntityType();
    $collection = Mage::getResourceModel('eav/entity_attribute_set_collection')
        ->setEntityTypeFilter($entityType->getId());

    $result = array();
    foreach ($collection as $attributeSet) {
        $result[] = array(
            'set_id' => $attributeSet->getId(),
            'name'   => $attributeSet->getAttributeSetName()
        );

    }

    return $result;
 }
} // Class Mage_Catalog_Model_Product_Attribute_Set_Api End

一旦将属性集关联到产品,就无法更改属性集或删除该属性集

解决方法是导出产品,然后修改图纸并导入

此链接还说明:
所以我也很想得到程序化的答案,但我没有时间去做。但这就是我能为这条链条提供的。当您试图从管理中删除属性时,您会看到所需的结果操作

步骤:

  • 确保attr集合中包含attr
  • 使用该属性集更新所有产品,使需要删除的属性为空
  • 从集合中删除属性
  • 似乎当我在从集合中删除attr之前没有清除所有attr时,结果是应用程序将行保留在那里。也许是为了安全,我不知道,因为我没有潜入水中。我所知道的是,如果在从集合中删除attr之前没有清除这些值,那么当您将attr设置为null时,attr将保持不变


    因此,编程解决方案将需要遵循这种模式。如果我有时间,我会写它,但我现在还有15项任务要做。

    看起来这是一篇老文章,但我也在这里寻找答案,我想我找到了解决方案

    为了解决这个问题,我必须直接使用产品资源的写适配器:

    $product->getResource()->getWriteConnection()

    从表中删除属性值

    在翻阅了一些代码之后,我得到了一些关于如何做到这一点的线索。请参阅
    Mage\u Catalog\u Model\u Resource\u Eav\u Mysql4\u Abstract::\u saveAttributeValue

        $write   = $this->_getWriteAdapter();
        $storeId = Mage::app()->getStore($object->getStoreId())->getId();
        $table   = $attribute->getBackend()->getTable();
    
        /**
         * If we work in single store mode all values should be saved just
         * for default store id
         * In this case we clear all not default values
         */
        if (Mage::app()->isSingleStoreMode()) {
            $storeId = $this->getDefaultStoreId();
            $write->delete($table, join(' AND ', array(
                $write->quoteInto('attribute_id=?', $attribute->getAttributeId()),
                $write->quoteInto('entity_id=?', $object->getEntityId()),
                $write->quoteInto('store_id<>?', $storeId)
            )));
        }
    
    在本例中,我正在查找要从产品中清除的特定属性,但您可以删除
    IF
    条件以删除每个附加值

    我还没有完全测试过这个,但到目前为止,它似乎是正确的
    $product=Mage::getModel('catalog/product')->load(MY_TARGET_PRODUCT_ID);
    $write=$product->getResource()->getWriteConnection();
    
    foreach($product->getAttributes() as $attribute) {
      if($attribute->getId()==MY_TARGET_ATTRIBUTE_ID) {
        $write->delete(
          $attribute->getBackend()->getTable(),
          join(' AND ', array(
            $write->quoteInto('attribute_id=?',$attribute->getAttributeId()),
            $write->quoteInto('entity_id=?',$product->getId())
          ))
        );
      }
    }