在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_pproduct_entity.int.value是option_id,而不是值。那么,我如何使它过滤实际的选项值呢?
假设一个名为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)
);
简而言之,如下所示:
$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(tablealias.column)称为cl_designer.value。
在joinTable之后,我现在可以将cl_designer_value视为任何其他属性代码,并正常使用它。
请记住,joinTable通过属性代码联接表,但一旦联接了一个表,在字段数组(第三个参数)中指定的属性代码就可以在下一个联接中使用。因此,如果需要的话,您可以将多个调用链接到joinTable,尽管公平地说,我真的不知道什么时候可以。