在Magento,我有一个名为cl_designer的属性,它是一个选择下拉选项。 我要过滤的产品集合就可以了,就像这样:
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('cl_designer', array('like' => $filter));
但是,这是行不通的! 当我打印出来以$收藏 - > getselect()查询,我看到它是比较$过滤器catalog_product_entity_int.value。 但这是错误的,因为选择选项,catalog_product_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是复杂的。 第一个参数是表的阵列加入的形式别名=>表名的。 表名可以是原名称(如这里),或标准的Magento斜杠符号。 第二个参数是形式为“初级=属性”的字符串。 无论是在=左侧被认为是此表中要使用的加入对列,不管是假设后=是属性代码。 然后,它转换成给予适当TABLE.COLUMN在加入到使用属性代码,但它不会添加,如果缺少表 - 这就是为什么我们需要的第一addAttributeToFilter。
下一个参数,以joinTable也是必需的,并且是形式别名=>列的阵列,其中的每个条目可用于由它的别名参考 - 所以我指定的数组(“cl_designer_value” =>“值”),这意味着我可以参考cl_designer_value.value(tablealias.column)为cl_designer_value。
在joinTable后,我现在可以把cl_designer_value任何其他属性代码,并正常使用。
请记住,joinTable加入由属性码表,而且,一旦你加入了一个,属性代码,你的字段数组中指定(第三个参数),然后可使用在你的下一个加入。 所以,你可以链多次打电话给一起joinTable,如果你需要,虽然是公平的我真的不能相信的时候你会的。