如何通过选择下拉属性过滤Magento的收藏?(How do I filter a magento

2019-07-19 15:54发布

在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,而不是价值。 那么,如何让实际期权价值筛选?

Answer 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)
    );


Answer 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是复杂的。 第一个参数是表的阵列加入的形式别名=>表名的。 表名可以是原名称(如这里),或标准的Magento斜杠符号。 第二个参数是形式为“初级=属性”的字符串。 无论是在=左侧被认为是此表中要使用的加入对列,不管是假设后=是属性代码。 然后,它转换成给予适当TABLE.COLUMN在加入到使用属性代码,但它不会添加,如果缺少表 - 这就是为什么我们需要的第一addAttributeToFilter。

下一个参数,以joinTable也是必需的,并且是形式别名=>列的阵列,其中的每个条目可用于由它的别名参考 - 所以我指定的数组(“cl_designer_value” =>“值”),这意味着我可以参考cl_designer_value.value(tablealias.column)为cl_designer_value。

在joinTable后,我现在可以把cl_designer_value任何其他属性代码,并正常使用。

请记住,joinTable加入由属性码表,而且,一旦你加入了一个,属性代码,你的字段数组中指定(第三个参数),然后可使用在你的下一个加入。 所以,你可以链多次打电话给一起joinTable,如果你需要,虽然是公平的我真的不能相信的时候你会的。



文章来源: How do I filter a magento collection by a select drop-down attribute?