Как я могу обновить название продукта с запросом SQL в Magento?

Теперь, я хочу заменить во всех названиях продукта 'пример' с 'тестом'. Как я делаю это?

Я не знаю, где название продукта сохранено в базе данных? Как я должен написать команду sql?

Я знаю, что команда sql будет

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

Как я изменяю его в Magento?

0
nl ja de
почему downvote вопрос?
добавлено автор stack2013110, источник

4 ответы

Обычно это - плохая идея непосредственно обновить вашу базу данных магнето, используя sql. Я рекомендовал бы, чтобы вы создали диспетчера, куда можно легко управлять этим небольшим сценарием:

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();
    }
}
4
добавлено
Используя этот подход, я полагаю, что необходимо будет использовать adminhtml диспетчера.
добавлено автор benmarks, источник
Можно поместить код в собственный модуль. Я рекомендую, чтобы вы прошли эта обучающая программа: это объясняет, как настроить модуль и диспетчера для него. Я don' t думают, что будет перерыв на коде, если you' ve получил приблизительно 10000 продуктов с ' example' на их имя. Если вы волнуетесь, о котором, можно добавить -> setPageSize (100) к грузу коллекции. Это ограничит ваш результат 100 отчетами или безотносительно числа, которое вы помещаете в него.
добавлено автор Vicky, источник
куда поместить вас, кодируют в? благодарите you.but, если продукт будет слишком многими, то код закончится время?
добавлено автор stack2013110, источник

The following code will update all products, it will change any instance of "example" to "test" in the name and uses the "saveAttribute" method which makes the update time negligible. This script will likely run 10k problems in a very short time, < 1 minute on a decent server.

this file would go in a sub-directory of your Magento install. calling $product->save() has some additional things going on in the background (such as firing events...but may not be necessary for your purposes). save() is a more complete method, but takes longer.

<?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
добавлено

Как указано Вики, не делайте этого использования прямой SQL. Magento резюмирует все достаточно хорошо, что это не необходимо.

В зависимости от того, что цель для обновления названий продукта, вам, возможно, не обязательно понадобится модуль/диспетчер, чтобы сделать это. Если вы просто делаете это, как только (или при случае по мере необходимости) просто идут сетка управления производством бэкенда, устанавливают фильтр так, чтобы продукты, которые вы хотите обновить, были показаны, нажмите кнопку 'Select All' на верхнем левом углу (ниже средств управления оповещением), то выберите 'Признаки Обновления' из 'Действий' избранный вход на верхнем правом углу. Тогда можно просто обновить название всех тех продуктов сразу.

0
добавлено

Прямое обновление Базы данных Мэдженто хитрое, но выполнимое. С вещью 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 = '0203MR-0'

Выставочный продукт 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
;
0
добавлено