Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过“选择”下拉属性筛选magento集合?_Php_Magento_Collections_Addattribute - Fatal编程技术网

Php 如何通过“选择”下拉属性筛选magento集合?

Php 如何通过“选择”下拉属性筛选magento集合?,php,magento,collections,addattribute,Php,Magento,Collections,Addattribute,在magento中,我有一个名为cl_designer的属性,它是一个选择下拉选项。我想在上面过滤产品集合,如下所示: $collection = Mage::getModel('catalog/product')->getCollection(); $collection->addAttributeToFilter('cl_designer', array('like' => $filter)); $collection-> addAttributeToFil

在magento中,我有一个名为cl_designer的属性,它是一个选择下拉选项。我想在上面过滤产品集合,如下所示:

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('cl_designer', array('like' => $filter));
$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));
但它不起作用!当我使用$collection->getselect()打印查询时,我看到它正在将$filter与catalog\u product\u entity\u int.value进行比较。但这是错误的,因为对于选择选项,catalog\u product\u entity\u int.value是选项的id,而不是值。那么,如何使其根据实际选项值进行过滤呢?

简而言之,如下所示:

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('cl_designer', array('like' => $filter));
$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\u product\u entity\u int表,并通过entity\u id、attribute\u id和store\u id正确地连接它。接下来,我们使用joinTable连接到eav\u attribute\u option\u值

可接合性是复杂的。第一个参数是要连接的表数组,其形式为alias=>tablename。tablename可以是原始名称(如此处所示),也可以是标准的magento斜杠符号。第二个参数是形式为“primary=attribute”的字符串。=左边的内容被假定为该表中要用于连接的列,而=后面的内容被假定为属性代码。然后,它将给定的属性代码转换为适当的table.column以在联接中使用,但如果缺少该表,则不会添加该表-这就是我们需要第一个addAttributeToFilter的原因

joinTable的下一个参数也是必需的,它是一个形式为alias=>列的数组,其中的每个条目都可以通过其别名引用-因此我指定了数组('cl_designer_value'=>'value'),这意味着我可以将cl_designer_value.value(tablealias.column)引用为cl_designer_值

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


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

假设一个名为
size
的示例下拉属性包含以下选项:

id    value
22    'small'
23    'medium'
24    'large'
并且您希望通过
中选项过滤您的收藏:

按下拉选项值筛选 要按产品(自定义)下拉属性的选项值筛选产品集合,请执行以下操作:

$sAttributeName = 'size';
$mOptionValue = 'medium';
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array(
            'eq' => Mage::getResourceModel('catalog/product')
                        ->getAttribute($sAttributeName)
                        ->getSource()
                        ->getOptionId($mOptionValue)
        )
    );
$sAttributeName = 'size';
$mOptionId = 23;
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array('eq' => $mOptionId)
    );
按下拉选项id筛选 要按产品(自定义)下拉属性的选项id筛选产品集合,请执行以下操作:

$sAttributeName = 'size';
$mOptionValue = 'medium';
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array(
            'eq' => Mage::getResourceModel('catalog/product')
                        ->getAttribute($sAttributeName)
                        ->getSource()
                        ->getOptionId($mOptionValue)
        )
    );
$sAttributeName = 'size';
$mOptionId = 23;
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array('eq' => $mOptionId)
    );

啊,但我不想使用“eq”进行过滤-我需要使用“like”,这在您的示例中是无法实现的。尽管如此,这个答案还是很好的,而且很有用。@Jürgen Thelen,你的答案非常有用。谢谢