Multi condicionais (OR e AND dentro de AND) em addAttributeToFilter

19

Como criar uma condição múltipla em addAttributeToFilter?

Eu quero resultado em uma consulta SQL como esta (imagem em anexo):

WHERE ((`e`.`news_from_date` > '2013-09-12') OR (`e`.`news_to_date` < '2013-09-12'))
AND ((((`e`.`special_price` IS NULL))) OR (((`e`.`special_price` IS NOT NULL)) AND ((`e`.`special_from_date` < '2013-09-12') OR (`e`.`special_to_date` > '2013-09-12'))))

$collection->addAttributeToFilter('special_price', array('null'=>'special_price'), 'left');

Obrigadoinsira a descrição da imagem aqui

Andhi Irawan
fonte
Achei isso muito útil: blog.chapagain.com.np/…
nicolallias

Respostas:

41

Você deve poder combinar a maioria dessas técnicas para criar a consulta desejada. Para tabelas de vendas, você provavelmente usará addFieldToFilter- mas Zend_Db_Expré provavelmente o caminho de menor resistência para você:

addAttributeToFilter:

De acordo com o Magento Wiki : Ao criar parênteses com ORcondições, você pode fazer o seguinte:

Se uma matriz for passada, mas nenhum código de atributo especificado, ele será interpretado como um grupo de condições OR que serão processadas da mesma maneira.

Então, a partir disso, podemos construir o seguinte:

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'someattribute','like' => 'value'),
        array('attribute'=> 'otherattribute','like' => 'value'),
        array('attribute'=> 'anotherattribute','like' => 'value'),
    )
);

Isso produzirá uma WHEREcláusula do formato:

WHERE ((someattribute LIKE 'value') OR (otherattribute LIKE 'value') OR (anotherattribute LIKE 'value'))

addFieldToFilter:

No caso em que o modelo está diretamente vinculado a uma tabela de banco de dados, é necessário o seguinte para aplicar condicionais à coluna do banco de dados por nome:

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

Zend_Db_Expr:

Para construções muito mais complicadas, você pode criar sua própria cláusula where usando Zend_Db_Expr. Por exemplo :

$collection->getSelect()->where(new Zend_Db_Expr("(e.created_at > '2013-01-01 00:00:00' OR e.created_at <'2012-01-01 00:00:00)"));

Fonte :

/programming/5301231/addattributetofilter-and-or-condition-in-magentos-collection

/programming/3826474/magento-addfieldtofilter-two-fields-match-as-or-not-and/7851884#7851884

philwinkle
fonte
Obrigado pela sua resposta, mas o que eu quero é fazer uma condição como: WHERE (CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 AND CONDITION_3 OR CONDITION_4))). Eu já postei a consulta que desejo acima.
Andhi Irawan 13/09/2013
11
Eu pensei que fez o ponto que você pode usar Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle
obrigado philwinkle.base na sua resposta, este é um exemplo do que fiz com as condições addAttributeToFilter e AND e OR: pastebin.com/ZznxLAai
Andhi Irawan
Existe uma maneira de determinar qual atributo produziu um resultado? Estou procurando uma coleção modelo personalizado em três campos ( name, altnernate_name, description) e gostaria de saber quando um resultado é por causa do descriptionatributo.
Psp2
4

Se você deseja incluir AND com a combinação de OR ,

$colemanManufacturerSku = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('sku_1')
    ->addAttributeToSelect('sku_2')
    ->addAttributeToSelect('sku_3')
    ->addAttributeToFilter('type_id', array('eq' => 'simple'))
    // Above condition will AND with following OR
    ->addAttributeToFilter(
        array(
            array(
                'attribute' => 'sku_1',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_2',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_3',
                'neq' => ''
            )
        )
    );
Hassan Ali Shahzad
fonte
2
+1 para a sua solução, mas preciso exatamente do contrário, ou seja, WHERE (CONDITION_1 E CONDITION_2) OU (CONDITION_3 AND CONDITION_4))), você pode ajudar
Haris
1

Ou condição usando addFieldToFilter


$collection->addFieldToFilter
                (   
                    array('email','mobile'),
                    array($emaiId,$mobNum)
                );

vitts
fonte