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 size和dress\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
一旦将属性集关联到产品,就无法更改属性集或删除该属性集 解决方法是导出产品,然后修改图纸并导入 此链接还说明:
所以我也很想得到程序化的答案,但我没有时间去做。但这就是我能为这条链条提供的。当您试图从管理中删除属性时,您会看到所需的结果操作 步骤:
因此,编程解决方案将需要遵循这种模式。如果我有时间,我会写它,但我现在还有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())
))
);
}
}