php collection - Magento addFieldToFilter: два поля, совпадающие с OR, а не AND




5 Answers

У меня есть другой способ добавить условие or условие в поле:

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

Я застрял на этом в течение последних нескольких часов. Я получил его работу, взломав несколько строк в /lib/Varien/Data/Collection/Db.php , но я предпочел бы использовать правильное решение и оставить свое ядро ​​нетронутым.

Все, что мне нужно сделать, это собрать коллекцию и отфильтровать ее двумя или более полями. Скажем, customer_firstname и remote_ip . Вот мой код (disfunctional without hacking Db.php ):

$collection = Mage::getModel('sales/order')->getCollection()->
addAttributeToSelect("*")->
addFieldToFilter(array(array('remote_ip', array('eq'=>'127.0.0.1')),
array('customer_firstname', array('eq'=>'gabe'))), array('eq'=>array(1,2,3)));

С запасом Db.php я попробовал это: (образец взят из http://magentoexpert.blogspot.com/2009/12/retrieve-products-with-specific.html )

$collection->addFieldToFilter(array(
    array('name'=>'orig_price','eq'=>'Widget A'),
    array('name'=>'orig_price','eq'=>'Widget B'),           
));

Но это дает мне эту ошибку:

Warning: Illegal offset type in isset or empty  in magento/lib/Varien/Data/Collection/Db.php on line 369

Если я обернуть это с помощью try / catch, то он переместится в _getConditionSql () и даст следующую ошибку:

Warning: Invalid argument supplied for foreach()  in magento/lib/Varien/Data/Collection/Db.php on line 412

У кого-нибудь есть рабочий, функциональный код для этого? Я запускаю Magento 1.9 (Enterprise). Благодаря!




Я также попытался получить field1 = 'a' OR field2 = '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());

Это дает мне

SELECT name, keywords FROM abc WHERE keywords like '%foo%' OR additional_keywords like '%bar%' .

Возможно, это не «пурпурный путь», но я застрял на нем 5 часов.

Надеюсь, это поможет




Для фильтрации по нескольким атрибутам используйте что-то вроде:

//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')
            )
        );

Для получения дополнительной информации проверьте: http://docs.magentocommerce.com/Varien/Varien_Data/Varien_Data_Collection_Db.html#_getConditionSql




Здесь немного путаницы, но позвольте мне попытаться прояснить ситуацию:

Допустим, вы хотели, чтобы sql выглядел примерно так:

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')
)

Чтобы добиться этого, ваша коллекция должна быть отформатирована следующим образом:

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

$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));

Теперь, чтобы понять, как это выглядит, вы всегда можете эхо-запрос, созданный с помощью

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



Чтобы создать простое условие OR для коллекции, используйте следующий формат:

    $orders = Mage::getModel('sales/order')->getResourceCollection();
    $orders->addFieldToFilter(
      'status',
      array(
        'processing',
        'pending',
      )
    );

Это создаст SQL следующим образом:

WHERE (((`status` = 'processing') OR (`status` = 'pending')))



Related

php magento magento-1.9