PHP如何添加存储在行而不是列中的值?

时间:2011-12-02 20:04:15

标签: php mysql sql magento

我需要添加一个php脚本来从一个cron作业运行,该作业将添加两个Magento属性值并将结果存储为MySQL数据库中的第三个属性。

任何帮助将不胜感激。我附上了一个屏幕截图,希望澄清事情。

2 个答案:

答案 0 :(得分:2)

在处理EAV模型时直接在SQL中工作很难。省下自己的努力,改用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_valuesecond_value和{{1}的属性}} 分别。使用实际属性的名称而不是数字141等。

答案 1 :(得分:0)

我认为应该这样做,但我没有测试过。

基本过程是创建一个临时表,其中包含您关注的实体的总和值,然后使用这些值更新正确的属性行。

请注意,这里不需要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

如果没有带有attribute_id = 141的行的entity_id,那个entity_id在这个sums表中将没有行 - 这是由EXISTS()条件确保的。

然后我们将catalog_product_entity_decimal表(我将其缩写为CPED)更新为在entity_id上加sums

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

SET CPED.value = sums.summedvalue执行实际设置。