【问题标题】:How do I filter a magento collection by a select drop-down attribute?如何通过选择下拉属性过滤 magento 集合?
【发布时间】:2013-01-24 13:50:41
【问题描述】:

在 magento 中,我有一个名为 cl_designer 的属性,它是一个选择下拉选项。我想过滤它上面的产品集合,像这样:

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

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

【问题讨论】:

    标签: php magento collections addattribute


    【解决方案1】:

    假设名为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)
        );
    

    【讨论】:

    • 啊,但我不想使用 'eq' 进行过滤 - 我需要使用 'like',这在您的示例中无法完成。不过,很好的答案和有用的知识。
    • @Jürgen Thelen,您的回答非常有帮助。谢谢
    【解决方案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 => 列的数组,其中的每个条目都可以通过其别名进行引用 - 所以我指定了 array('cl_designer_value' => 'value') ,这意味着我可以将 cl_designer_value.value (tablealias.column) 称为 cl_designer_value。

    joinTable 之后,我现在可以把 c​​l_designer_value 当作任何其他属性代码,并且可以正常使用了。

    请记住,joinTable 通过属性代码连接一个表,而且一旦您连接了一个表,您在字段数组(第三个参数)中指定的属性代码就可以在您的下一个连接中使用。因此,如果需要,您可以将多个对 joinTable 的调用链接在一起,但公平地说,我真的不知道您何时会这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多