Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.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 addFieldToFilter:两个字段,匹配为或,非和_Php_Magento_Magento 1.9 - Fatal编程技术网

Php Magento addFieldToFilter:两个字段,匹配为或,非和

Php Magento addFieldToFilter:两个字段,匹配为或,非和,php,magento,magento-1.9,Php,Magento,Magento 1.9,在过去的几个小时里,我一直被这个问题困扰着。我通过在/lib/Varien/Data/Collection/Db.php中修改几行代码来实现它,但我宁愿使用正确的解决方案,而不去触及我的核心 我所需要做的就是获取一个集合并按两个或多个字段对其进行筛选。比如说,customer\u firstname和remote\u ip。下面是我的代码(在没有黑客攻击的情况下不起作用Db.php): 我用一只股票Db.php,尝试了以下方法:(样本取自) 但这给了我一个错误: Warning: Illegal

在过去的几个小时里,我一直被这个问题困扰着。我通过在
/lib/Varien/Data/Collection/Db.php
中修改几行代码来实现它,但我宁愿使用正确的解决方案,而不去触及我的核心

我所需要做的就是获取一个集合并按两个或多个字段对其进行筛选。比如说,
customer\u firstname
remote\u ip
。下面是我的代码(在没有黑客攻击的情况下不起作用
Db.php
):

我用一只股票
Db.php
,尝试了以下方法:(样本取自)

但这给了我一个错误:

Warning: Illegal offset type in isset or empty  in magento/lib/Varien/Data/Collection/Db.php on line 369
Warning: Invalid argument supplied for foreach()  in magento/lib/Varien/Data/Collection/Db.php on line 412
如果我用try/catch将其包装,那么它将进入_getConditionSql(),并给出以下错误:

Warning: Illegal offset type in isset or empty  in magento/lib/Varien/Data/Collection/Db.php on line 369
Warning: Invalid argument supplied for foreach()  in magento/lib/Varien/Data/Collection/Db.php on line 412

有人有任何工作的、功能性的代码来做这件事吗?我正在运行Magento 1.9(企业版)。谢谢

要按多个属性进行过滤,请使用以下内容:

//for AND
    $collection = Mage::getModel('sales/order')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter('my_field1', 'my_value1')
    ->addFieldToFilter('my_field2', 'my_value2');

    echo $collection->getSelect()->__toString();

//for OR - please note 'attribute' is the key name and must remain the same, only replace //the value (my_field1, my_field2) with your attribute name


    $collection = Mage::getModel('sales/order')->getCollection()
        ->addAttributeToSelect('*')
        ->addFieldToFilter(
            array(
                array('attribute'=>'my_field1','eq'=>'my_value1'),
                array('attribute'=>'my_field2', 'eq'=>'my_value2')
            )
        );
SELECT 
    `main_table`.*, 
    `main_table`.`email` AS `invitation_email`, 
    `main_table`.`group_id` AS `invitee_group_id` 
FROM 
    `enterprise_invitation` AS `main_table` 
WHERE (
    (status = 'new') 
    OR (customer_id = '1234')
)
... WHERE (
         (field_1 IN ('text_1', 'text_2', 'text_3') OR field_1 LIKE '%text')
      OR (field_2 = 'exact')
      OR (field_3 IN ('val_1', 'val_2'))
    )
有关更多信息,请查看:

我还尝试获取
字段1='a'或字段2='b'

你的密码对我不起作用

这是我的解决办法

$results = Mage::getModel('xyz/abc')->getCollection();
$results->addFieldToSelect('name');
$results->addFieldToSelect('keywords');
$results->addOrder('name','ASC');
$results->setPageSize(5);

$results->getSelect()->where("keywords like '%foo%' or additional_keywords  like '%bar%'");

$results->load();

echo json_encode($results->toArray());
它给了我

从abc中选择名称、关键字,其中的关键字如“%foo%”或其他关键字如“%bar%”

这可能不是“magento的方式”,但我在这方面被困了5个小时


希望它能有所帮助

谢谢安达,你的帖子帮了大忙!! 然而,OR语句对我来说并不太有效,我犯了一个错误: getCollection()“为foreach提供的参数无效”

这就是我的结尾(注意属性被指定了3次,而不是本例中的2次):


addFieldToFilter首先需要一个字段,然后是条件->我有另一种方法在字段中添加
条件:

->addFieldToFilter(
    array('title', 'content'),
    array(
        array('like'=>'%$titlesearchtext%'), 
        array('like'=>'%$contentsearchtext%')
    )
)

以下是我在Enterprise 1.11中的解决方案(应适用于CE 1.6):

这将导致以下SQL:

    SELECT `main_table`.*
    FROM `shipping_method_entity` AS `main_table`
    WHERE (((max_item_count >= 10) OR (max_item_count IS NULL)))
      AND (((max_item_price >= 9.99) OR (max_item_price IS NULL)))
      AND (((max_item_weight >= 1.5) OR (max_item_weight IS NULL)))

这里有点混乱,但让我试着澄清一下:

假设您需要类似以下内容的sql:

//for AND
    $collection = Mage::getModel('sales/order')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter('my_field1', 'my_value1')
    ->addFieldToFilter('my_field2', 'my_value2');

    echo $collection->getSelect()->__toString();

//for OR - please note 'attribute' is the key name and must remain the same, only replace //the value (my_field1, my_field2) with your attribute name


    $collection = Mage::getModel('sales/order')->getCollection()
        ->addAttributeToSelect('*')
        ->addFieldToFilter(
            array(
                array('attribute'=>'my_field1','eq'=>'my_value1'),
                array('attribute'=>'my_field2', 'eq'=>'my_value2')
            )
        );
SELECT 
    `main_table`.*, 
    `main_table`.`email` AS `invitation_email`, 
    `main_table`.`group_id` AS `invitee_group_id` 
FROM 
    `enterprise_invitation` AS `main_table` 
WHERE (
    (status = 'new') 
    OR (customer_id = '1234')
)
... WHERE (
         (field_1 IN ('text_1', 'text_2', 'text_3') OR field_1 LIKE '%text')
      OR (field_2 = 'exact')
      OR (field_3 IN ('val_1', 'val_2'))
    )
为了实现这一点,您的收藏需要按如下方式格式化:

$collection = Mage::getModel('enterprise_invitation/invitation')->getCollection();

$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));
$collection->addFieldToFilter(
    array('field_1', 'field_2', 'field_3'), // columns
    array( // conditions
        array( // conditions for field_1
            array('in' => array('text_1', 'text_2', 'text_3')),
            array('like' => '%text')
        ),
        array('eq' => 'exact'), // condition for field 2
        array('in' => array('val_1', 'val_2')) // condition for field 3
    )
);
WHERE (((`status` = 'processing') OR (`status` = 'pending')))
现在,您可以使用

echo $collection->getSelect()->__toString();

或者可以生成如下条件:

$collection = Mage::getModel('enterprise_invitation/invitation')->getCollection();

$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));
$collection->addFieldToFilter(
    array('field_1', 'field_2', 'field_3'), // columns
    array( // conditions
        array( // conditions for field_1
            array('in' => array('text_1', 'text_2', 'text_3')),
            array('like' => '%text')
        ),
        array('eq' => 'exact'), // condition for field 2
        array('in' => array('val_1', 'val_2')) // condition for field 3
    )
);
WHERE (((`status` = 'processing') OR (`status` = 'pending')))
这将生成一个SQL,其中的条件如下:

//for AND
    $collection = Mage::getModel('sales/order')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter('my_field1', 'my_value1')
    ->addFieldToFilter('my_field2', 'my_value2');

    echo $collection->getSelect()->__toString();

//for OR - please note 'attribute' is the key name and must remain the same, only replace //the value (my_field1, my_field2) with your attribute name


    $collection = Mage::getModel('sales/order')->getCollection()
        ->addAttributeToSelect('*')
        ->addFieldToFilter(
            array(
                array('attribute'=>'my_field1','eq'=>'my_value1'),
                array('attribute'=>'my_field2', 'eq'=>'my_value2')
            )
        );
SELECT 
    `main_table`.*, 
    `main_table`.`email` AS `invitation_email`, 
    `main_table`.`group_id` AS `invitee_group_id` 
FROM 
    `enterprise_invitation` AS `main_table` 
WHERE (
    (status = 'new') 
    OR (customer_id = '1234')
)
... WHERE (
         (field_1 IN ('text_1', 'text_2', 'text_3') OR field_1 LIKE '%text')
      OR (field_2 = 'exact')
      OR (field_3 IN ('val_1', 'val_2'))
    )

每个嵌套数组()为OR条件生成另一组括号。

这是真正的magento方式:

    $collection=Mage::getModel('sales/order')
                ->getCollection()
                ->addFieldToFilter(
                        array(
                            'customer_firstname',//attribute_1 with key 0
                            'remote_ip',//attribute_2 with key 1
                        ),
                        array(
                            array('eq'=>'gabe'),//condition for attribute_1 with key 0
                            array('eq'=>'127.0.0.1'),//condition for attribute_2
                                )
                            )
                        );
结果:

WHERE (((e.sku like 'a%') or (e.sku like 'b%')))

来源:

要为收集创建简单或条件,请使用以下格式:

    $orders = Mage::getModel('sales/order')->getResourceCollection();
    $orders->addFieldToFilter(
      'status',
      array(
        'processing',
        'pending',
      )
    );
这将产生如下SQL:

$collection = Mage::getModel('enterprise_invitation/invitation')->getCollection();

$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));
$collection->addFieldToFilter(
    array('field_1', 'field_2', 'field_3'), // columns
    array( // conditions
        array( // conditions for field_1
            array('in' => array('text_1', 'text_2', 'text_3')),
            array('like' => '%text')
        ),
        array('eq' => 'exact'), // condition for field 2
        array('in' => array('val_1', 'val_2')) // condition for field 3
    )
);
WHERE (((`status` = 'processing') OR (`status` = 'pending')))

谢谢,安达。但这是为了要求两个字段,而不是一个或另一个。如果将->getSelectSql()添加到该查询的末尾,它将为您提供“…WHERE(my_field1='my_value1')和(my_field2='my_value2')”。我试图获取的是“WHERE(myfield1='myvalue1')或(myfield2='myvalue2')”。这仅适用于EAV集合中的addAttributeToFilter。Riyazkhan的答案是正确的。@1对于某个或某个条件不正确。我尝试了所有答案,这是唯一对我有效的答案。Anda对OR的回答是试图搜索一个名为“attribute”的属性,所以我不断得到未知列“attribute”错误。其他解决方案具有正确的列名,但没有值。这在SQL中为我提供了正确的结果:
。。。其中('first_attribute'='some value')或('second_attribute'='some value'))
尝试这种方法我找不到一列:1054在'WHERE子句'error'中未知列'Array',请注意此语法对于addAttributeToFilter不正确,这也是我所知道的最好的解决方案。几个小时以来,我一直在尝试让一个复杂的查询用于定制资源模型。这就是最终成功的原因。谢谢。这样做的原因是它使用第一个参数(字段数组)中的键查找第二个参数(条件数组)中用于该字段的值。我发现这样做会更清楚一些:
$collection->addFieldToFilter(数组('field_1'=>'field_1','field_2'=>'field_2')、数组('field_1'=>数组('in'=>数组('text_1','text_2','text_3')、数组('like'=>'%text'))、'field_2'=>数组('eq'=>'exact'));
此筛选器实际上适用于或条件。谢谢!请注意,此语法对于addAttributeToFilter不正确,请参阅stackoverflow.com/a/5301457/3338098了解该语法