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

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

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

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

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

Как изменить его в Magento?


person stack2013110    schedule 09.01.2013    source источник
comment
зачем минусовать вопрос?   -  person stack2013110    schedule 09.01.2013


Ответы (4)


Как правило, обновлять базу данных magento напрямую с помощью 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();
    }
}
person Vicky    schedule 09.01.2013
comment
куда вставить код? спасибо. но если товара слишком много, время действия кода истечет? - person stack2013110; 09.01.2013
comment
Вы можете поместить код в свой собственный модуль. Я рекомендую вам ознакомиться с этим руководством: в нем объясняется, как настроить модуль и контроллер для него. Я не думаю, что для кода будет тайм-аут, если только у вас нет около 10000 продуктов с «примером» в их названии. Если вас это беспокоит, вы можете добавить ->setPageSize(100) к загрузке коллекции. Это ограничит ваш результат до 100 записей или любого числа, которое вы в него введете. - person Vicky; 09.01.2013
comment
Используя этот подход, я считаю, что вам нужно будет использовать контроллер adminhtml. - person benmarks; 10.01.2013

Следующий код обновит все продукты, он изменит любой экземпляр «example» на «test» в имени и использует метод «saveAttribute», который делает время обновления незначительным. Этот скрипт, вероятно, выполнит 10 000 проблем за очень короткое время, ‹ 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');
}
person Ian    schedule 10.01.2013

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

В зависимости от цели обновления названий продуктов вам может не понадобиться для этого модуль/контроллер. Если вы делаете это только один раз (или время от времени по мере необходимости), просто зайдите в сетку управления бэкэнд-продуктом, установите фильтр так, чтобы отображались продукты, которые вы хотите обновить, нажмите кнопку «Выбрать все» в левом верхнем углу (ниже элементы управления пейджингом), затем выберите «Обновить атрибуты» в меню «Действия» в правом верхнем углу. Затем вы можете просто обновить название для всех этих продуктов одновременно.

person pspahn    schedule 09.01.2013

Прямое обновление базы данных Magento сложно, но выполнимо. С EAV нужно разобраться.

В этой таблице хранятся идентификатор продукта и артикул.

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.

введите здесь описание изображения

Хитрость заключается в том, чтобы знать, какую из таблиц entity_X использовать и какой атрибут attribute_id используется для конкретного атрибута. Атрибуты attribute_ids будут варьироваться от системы к системе. Этот запрос поможет вам увидеть свой. Этот пример ищет только в таблице _entity_varchar. Ваш атрибут может быть в _entity_int, _entity_text и т. д. В этом примере показаны значения для одного продукта, в данном случае где sku='0203MR-0'

Показать идентификаторы атрибутов продукта

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
;
person dlink    schedule 22.12.2016