PHP Как добавить значения, хранящиеся в строках, а не в столбцах? - PullRequest
1 голос
/ 03 декабря 2011

Мне нужно добавить скрипт php для запуска из задания cron, которое добавит два значения атрибута Magento и сохранит результат как третий атрибут в базе данных MySQL.

Любая помощь будет оценена.Я приложил снимок экрана, который, надеюсь, прояснит ситуацию.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Работать напрямую в SQL при работе с EAV-моделями сложно. Сэкономьте силы и используйте вместо этого классы Magento. Минимальный скрипт cron может выглядеть примерно так:

<?php

require 'app/Mage.php';
umask(0);
Mage::app();

$products = Mage::getModel('catalog/product')->getCollection();
foreach ($products as $product) {
    $product->setSumValue(
        $product->getFirstValue() + $product->getSecondValue()
    )
    ->save();
}

Magento предоставляет магические методы, поэтому вы можете использовать синтаксис, такой как getFirstValue(), getSecondValue() и setSumValue(), чтобы ссылаться на атрибуты с именами first_value, second_value и sum_value соответственно. Используйте имена ваших фактических атрибутов вместо цифр 141 и т. Д.

0 голосов
/ 03 декабря 2011

Я думаю, что это должно сделать это, но я не проверял это.

Основная процедура - создать временную таблицу, которая содержит суммированные значения для тех объектов, которые вам интересны, а затем обновить соответствующий атрибутстроки с этими значениями.

Обратите внимание, что php здесь не нужен, только SQL.Конечно, вы можете захотеть использовать php для выдачи запроса.

UPDATE 
catalog_product_entity_decimal, 
(SELECT entity_id, SUM(value) AS summedvalue FROM catalog_product_entity_decimal as cped 
    WHERE attribute_id IN (145, 146)
    AND EXISTS (SELECT 1 FROM catalog_product_entity_decimal WHERE entity_id=cped.entity_id and attribute_id=141)
    GROUP BY entity_id 
) AS sums

SET catalog_product_entity_decimal.value = sums.summedvalue
WHERE catalog_product_entity_decimal.entity_id=sums.entity_id
    AND catalog_product_entity_decimal.attribute_id=141;

Это создает промежуточную таблицу sums, которая выглядит следующим образом (на основе данных в скриншоте таблицы):

entity_id | summedvalue
1         | 12
2         | 0

Если есть entity_id без строки с attribute_id = 141, у этого entity_id не будет строки в этой таблице sums - это обеспечивается условием EXISTS ().

Затем мы обновляемтаблицу catalog_product_entity_decimal (сокращенно CPED), соединяя ее с sums для entity_id.

CPED.entity_id | CPED.attribute_id | sums.entity_id | sums.summedvalue
1              | 145               | 1              | 12
2              | 145               | 2              | 0

SET CPED.value = sums.summedvalue выполняет фактическую настройку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...