如何通过选择下拉属性过滤magento集合?

时间:2013-02-08 18:02:32

标签: php magento collections addattribute

在magento中,我有一个名为cl_designer的属性,它是一个选择下拉选项。我想在其上过滤产品系列,如下所示:

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('cl_designer', array('like' => $filter));

但它不起作用!当我使用$ collection-> getselect()打印出查询时,我发现它正在将$ filter与catalog_product_entity_int.value进行比较。但这是错误的,因为对于select选项,catalog_product_entity_int.value是option_id,而不是值。那么如何让它过滤实际的期权价值呢?

2 个答案:

答案 0 :(得分:8)

假设名为size的示例下拉属性包含以下选项:

id    value
22    'small'
23    'medium'
24    'large'

并且您希望按'medium'选项过滤您的收藏:

按下拉选项值

过滤

按产品(自定义)下拉属性的选项值过滤产品系列:

$sAttributeName = 'size';
$mOptionValue = 'medium';
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array(
            'eq' => Mage::getResourceModel('catalog/product')
                        ->getAttribute($sAttributeName)
                        ->getSource()
                        ->getOptionId($mOptionValue)
        )
    );

按下拉选项ID

过滤

按产品(自定义)下拉属性的选项ID过滤产品集合:

$sAttributeName = 'size';
$mOptionId = 23;
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array('eq' => $mOptionId)
    );

答案 1 :(得分:2)

简而言之,就像这样:

$collection->
    addAttributeToFilter(
        array(
            array('attribute' => 'cl_designer', 'eq' => ''),
            array('attribute' => 'cl_designer', 'neq' => '')
        ))->
    joinTable(array('cl_designer_value'=>'eav_attribute_option_value'),'option_id = cl_designer', array('cl_designer_value' => 'value'))->
    addAttributeToFilter('cl_designer_value', array('like' => $filter));

需要第一个addAttributeToFilter才能使其包含正确的catalog_product_entity_int表,并通过entity_id,attribute_id和store_id正确加入它。接下来,我们使用joinTable连接到eav_attribute_option_value。

joinTable很复杂。第一个参数是要连接的表数组,形式为alias =>表名。 tablename可以是原始名称(如此处),也可以是标准的magento斜杠表示法。第二个参数是“primary = attribute”形式的字符串。无论在左边的是什么,都假设是你想要用来连接的这个表中的列,以及在=之后的任何内容都被假定为属性代码。然后它将给定的属性代码转换为在连接中使用的正确table.column,但如果丢失则不添加表 - 这就是我们需要第一个addAttributeToFilter的原因。

joinTable的下一个参数也是必需的,并且是alias =>形式的数组。列,其每个条目可通过其别名引用 - 所以我指定了数组('cl_designer_value'=>'value'),这意味着我可以将cl_designer_value.value(tablealias.column)称为cl_designer_value。

在joinTable之后,我现在可以将cl_designer_value视为任何其他属性代码,并正常使用它。

请记住,joinTable按属性代码加入一个表,但是一旦你加入一个表,你在fields数组(第三个参数)中指定的属性代码就可以在你的下一个连接中使用了。所以你可以把几个连接调用连接到一起,如果你需要的话,虽然公平但我不能真正想到你什么时候。