如何在Magento中使用sql查询更新产品名称?

时间:2013-01-09 16:43:49

标签: magento magento-1.6

现在,我想用'test'替换所有产品名称'example'。我该怎么做?

我不知道产品名称存储在数据库中的哪个位置?我该如何编写sql命令?

我知道sql命令将是

 update table_name set product_name = replace(value,"example","test")

如何在Magento中更改它?

4 个答案:

答案 0 :(得分:4)

通常,使用sql直接更新magento数据库是个坏主意。我建议你创建一个控制器,在那里你可以轻松运行这个小脚本:

public function databaseAction() {
    // load all products where 'name' LIKE '%example%'
    $products = Mage::getModel('catalog/product')->getCollection()
                ->addAttributeToSelect('name')
                ->addFieldToFilter(array(
                        array('attribute' => 'name', 'like' => '%example%')
                ));

    // loop through products, update the product name and save the product
    foreach ($products as $product) {
        $product->setName(str_replace('example', 'test', $product->getName()));
        $product->save();
    }
}

答案 1 :(得分:2)

以下代码将更新所有产品,它会将名称中“example”的任何实例更改为“test”,并使用“saveAttribute”方法,使更新时间可以忽略不计。该脚本可能会在很短的时间内运行10k问题,<在体面的服务器上1分钟。

此文件将放在Magento安装的子目录中。调用$ product-> save()会在后台执行一些其他操作(例如触发事件......但可能不是出于您的目的而需要)。 save()是一个更完整的方法,但需要更长的时间。

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', TRUE);
ini_set('log_errors', TRUE);
set_time_limit(0);

//Include the Mage package
require_once '../app/Mage.php';

//Set Developer mode to true, allows for more verbose errors
Mage::setIsDeveloperMode(true);

//Set php to display errors
ini_set('display_errors', 1);

//Initialize the app.
//Mage::app();
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

//Start timer
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());

    return ((float) $usec + (float) $sec);
}

$time_start = microtime_float();
///////END HEADER//////

$products = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('name',array('like'=>'%example%'));

foreach ($products as $product) {
    $newName = str_replace('example','test',$product->getName());
    $product->setName($newName);
    //can replace the next line with:  $product->save()
    $product->getResource()->saveAttribute($product,'name');
}

答案 2 :(得分:0)

正如Vicky所说,不要使用直接SQL。 Magento将所有内容抽象得很好,没有必要。

根据更新产品名称的目的,您可能不一定需要模块/控制器来执行此操作。如果您只是这样做(或偶尔必要时),只需进入后端产品管理网格,设置过滤器以显示要更新的产品,单击左上角的“全选”按钮(下方)分页控件),然后从右上角的'Actions'选择输入中选择'Update Attributes'。然后,您可以一次更新所有这些产品的名称。

答案 3 :(得分:0)

直接更新Magento数据库很棘手,但可行。 EAV的事情需要处理。

产品entity_id和sku存储在此表中

catalog_product_entity

产品属性名称存储在其中一个表中,系统中可能还有其他名称。

catalog_product_entity_datetime
catalog_product_entity_decimal
catalog_product_entity_gallery
catalog_product_entity_int
catalog_product_entity_media_gallery
catalog_product_entity_text
catalog_product_entity_url_key
catalog_product_entity_varchar

属性值存储在

eav_attribute

所以你需要将这三个表连接在一起。这是一个实体关系图,它显示了它的工作原理,并对SQL进行了示例。

enter image description here

技巧是知道要使用哪个entity_X表,以及对于特定属性使用什么attribute_id。 attribute_ids因系统而异。此查询将帮助您查看您的。此示例仅查看_entity_varchar表。您的属性可能位于_entity_int或_entity_text等中。此示例显示单个产品的值,在这种情况下,sku =&#39; 0203MR-0&#39;

显示产品attribute_ids

select
   p.entity_id,
   p.entity_type_id,
   p.attribute_set_id,
   p.type_id,
   p.sku,
   a.attribute_id,
   a.frontend_label as attribute,
   av.value
from
   catalog_product_entity p
   left join catalog_product_entity_varchar av on
      p.entity_id = av.entity_id
   left join eav_attribute a on
      av.attribute_id = a.attribute_id
where
   p.sku = '0203MR-0'
;

了解相关属性的attribute_id后,您可以列出或更新这些属性。在这种情况下,我们对产品名称感兴趣,在我的系统中,attribute_id是71。

列出产品名称

select
   p.entity_id,
   p.entity_type_id,
   p.attribute_set_id,
   p.type_id,
   p.sku,
   a.attribute_id,
   a.frontend_label as attribute,
   av.value
from
   catalog_product_entity p
   join catalog_product_entity_text av on
      p.entity_id = av.entity_id
   join eav_attribute a on
      av.attribute_id = a.attribute_id
where
   a.attribute_id = 71
;

更新产品名称

update
   catalog_product_entity p
   join catalog_product_entity_text av on
      p.entity_id = av.entity_id
   join eav_attribute a on
      av.attribute_id = a.attribute_id
set
   av.value = replace(av.value,
      'example',
      'test')
where
   a.attribute_id = 71
;