5

在 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,而不是值。那么如何让它过滤实际的期权价值呢?

4

2 回答 2

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)
    );
于 2013-02-09T09:54:55.213 回答
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 => column 的数组,其中的每个条目都可以通过其别名进行引用 - 所以我指定了 array('cl_designer_value' => 'value'),这意味着我可以将 cl_designer_value.value (tablealias.column) 称为 cl_designer_value。

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

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

于 2013-02-08T18:02:31.933 回答