通过比较Magento

时间:2016-06-08 10:20:12

标签: php magento

我正在研究一些脚本来自动化网店内的一些东西。

我查看了许多论坛和问题 现在我几乎完成了我的剧本,但有一件小事不起作用,但我想不出我做错了什么。

此脚本的目标是获取与数组中的值具有相同属性值的产品(从数据库中提取)。

所以这是我的代码:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once('../app/Mage.php');
require_once('db.php');


Mage::app();

$db = db_connection();

$collection = Mage::getModel('catalog/product')->getCollection();

$collection->addAttributeToSelect('ean');  


$getean = $db->prepare('SELECT ean_l FROM mytable');
$getean->execute();
$allean = $getean->fetchAll();


foreach($allean as $ean) {

    $collection->addFieldToFilter(array(
        array('attribute'=>'ean','eq'=>'' . $ean['ean_l'] . ''),     
    ));
    echo 'ean_l: ' . $ean['ean_l'] . '<br>';

    foreach ($collection as $product) {

        echo $product['entity_id'];

    }


}

所以这是它的工作原理:

我们选择一个属性(ean) 我们从数据库中获得所有ean编号的列表 我们遍历列表并将任何产品与ean编号进行比较 然后我们遍历集合并获取相应产品的ID 然而,所有$product['entity_id']都是273.正确的是,entity_id是273,但也有产品274具有相应的ean编号。

以下是脚本的结果(它还有很多):

result

那为什么呢?因为在我的推理中,它改变了每个循环的ean_l,并将其与属性值相等 然后它应该改变收藏,对吗? 所以不应该至少在某一点上显示274?

这个问题对于Magento程序员来说并不是特别的,但其他程序员也可以提供帮助,所以我想把它发布在SO上。

1 个答案:

答案 0 :(得分:0)

Magento带有强大的过滤和查询集合。如果不满足,您可以随时使用自定义查询扩展到getSelect函数。一些信息here

在该foreach中使用addFieldToFilter将在另一次迭代过滤后过滤剩余的值。所以这不好。

$allean = array("of", "ean", "values", "needed", "for", "filtering");

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('ean');
//addAttributeToFilter for EAV collections
$collection->addAttributeToFilter('ean', array('in' => $allean)); //not addFieldToFilter
$collection->getColumnValues('entity_id');

var_dump($collection); //will output an array of product_ids

或者,如果要按ean值进行分组,则应删除getColumnValues并运行group命令。 您可以找到其他信息here

或者您只需删除getColumnValues,即可手动启动foreach($collection as $product)并进行分组,或使用这些已过滤的产品执行您想要的操作。