【问题标题】:Magento addFieldToFilter allow NULLsMagento addFieldToFilter 允许 NULL
【发布时间】:2010-12-18 14:17:36
【问题描述】:

当使用 Magento 收集方法 addFieldToFilter 时,是否可以允许按 NULL 值进行过滤?我想选择集合中具有自定义属性的所有产品,即使没有为该属性分配值。

【问题讨论】:

    标签: magento


    【解决方案1】:

    我看到你已经找到了解决方案,但也有这个选项:

    $collection->addFieldToFilter('parent_item_id', array('null' => true));
    

    但是如果你想使用 "NULL" => false,那是行不通的。 (我注意到你可以使用“in”、“nin”、“eq”、“neq”、“gt”等元素),你可以这样做:

    $collection->addFieldToFilter('parent_item_id', array('neq' => 'NULL' ));
    

    希望这仍然有帮助...

    【讨论】:

    • 查看 Varien_Data_Collection_Db::_getConditionSql() 代码中的文档。它描述了所有可能的选项,例如提到的“null”,但也描述了相反的“notnull”。
    【解决方案2】:

    这适用于 NOT NULL 过滤器

    $collection->addFieldToFilter('parent_item_id', array('notnull' => true));
    

    【讨论】:

      【解决方案3】:

      通过 null/empty 属性过滤产品集合有两种可能的解决方案。 Magento 使用 INNER JOIN 来获取要过滤的属性值。但是如果没有为产品属性分配值,则连接将失败,因为缺少数据库表/关系。

      解决方案 #1: 使用 addAttributeToFilter() 并将连接类型从“inner”(默认)更改为“left”:

      $collection = Mage::getModel('catalog/product')->getCollection();
      $collection->addAttributeToFilter('custom_attribute', array( ... condition options ..), 'left');
      

      解决方案#2:确保您的自定义属性具有默认值。 Magento 在这方面是保守的。如果给属性一个值,Magento 只会创建属性和产品之间的关系。因此,如果没有用户指定的值或默认值,则该属性将无法用于过滤产品即使该属性出现在管理面板下的产品详细信息视图中。

      【讨论】:

      • 获取属性时必须左连接,IMO。
      【解决方案4】:

      因为问题与问题的标题不完全匹配,我通过搜索以下条件多次找到它们:special VALUE OR NULL

      如果要过滤匹配 VALUE OR NULL 的集合,则可以使用:

      $collection->addFieldToFilter('<attribute>', array(
        array('eq' => '<value>'),
        array('null' => true)
      ));
      

      【讨论】:

        【解决方案5】:

        您不需要使用addFieldToFilter

        现在的解决方案:
        属性名称在magento中称为code,您只需要使用下面的代码将所有具有特定属性的产品作为数组获取

        $prodsArray=Mage::getModel('catalog/product')->getCollection() ->addAttributeToFilter('custom_attribute_code') ->getItems();

        您还可以在addAttributeToFilter的第二个参数中为addAttributeToFilter中的属性值指定某些条件。

        您可以在此文件中找到此方法(以供进一步研究):

        app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php
        

        【讨论】:

        • 感谢您指出 addFieldToFilter - 它导致了处理 NULL 字段的解决方案
        • 这实际上是错误的,这将与空''进行比较而不是“为空”过滤。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 2015-06-29
        相关资源
        最近更新 更多