Ben*_*ird 4 php collections magento addattribute
在magento中,我有一个名为cl_designer的属性,它是一个选择下拉选项.我想在其上过滤产品系列,如下所示:
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('cl_designer', array('like' => $filter));
Run Code Online (Sandbox Code Playgroud)
但它不起作用!当我使用$ collection-> getselect()打印出查询时,我发现它正在将$ filter与catalog_product_entity_int.value进行比较.但这是错误的,因为对于select选项,catalog_product_entity_int.value是option_id,而不是值.那么如何让它过滤实际的期权价值呢?
假设命名的示例下拉属性size
包含以下选项:
id value
22 'small'
23 'medium'
24 'large'
Run Code Online (Sandbox Code Playgroud)
并且您希望按'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)
)
);
Run Code Online (Sandbox Code Playgroud)
要按产品(自定义)下拉属性的选项ID过滤产品集合,请执行以下操作:
$sAttributeName = 'size';
$mOptionId = 23;
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter(
$sAttributeName,
array('eq' => $mOptionId)
);
Run Code Online (Sandbox Code Playgroud)
简而言之,就像这样:
$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));
Run Code Online (Sandbox Code Playgroud)
需要第一个 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 的下一个参数也是必需的,它是一个别名 => 列形式的数组,其中的每个条目都可以通过其别名进行引用 - 所以我指定了 array('cl_designer_value' => 'value'),这意味着我可以将 cl_designer_value.value (tablealias.column) 称为 cl_designer_value。
在 joinTable 之后,我现在可以将 cl_designer_value 视为任何其他属性代码,并正常使用它。
请记住,joinTable 通过属性代码连接表,而且一旦您连接了一个表,您在 fields 数组(第三个参数)中指定的属性代码就可以在下一个连接中使用。因此,如果需要的话,您可以将对 joinTable 的多个调用链接在一起,尽管公平地说,我真的无法想到您何时会这样做。