addAttributeToFilter의 다중 조건부 (OR 및 AND 내부 AND)


19

addAttributeToFilter에서 다중 조건을 만드는 방법은 무엇입니까?

다음과 같은 SQL 쿼리 결과를 원합니다 (이미지 첨부).

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

감사합니다여기에 이미지 설명을 입력하십시오


나는 이것이 매우 유용하다는 것을 알았다 : blog.chapagain.com.np/…
nicolallias

답변:


41

이러한 기술 대부분을 결합하여 원하는 쿼리를 만들 수 있어야합니다. 판매 테이블의 경우 아마도 사용 addFieldToFilter하지만 아마도 Zend_Db_Expr가장 저항이 적은 경로 일 것입니다.

addAttributeToFilter :

Magento Wiki에 따르면 : OR조건이있는 괄호를 만들 때 다음을 수행 할 수 있습니다.

배열이 전달되었지만 속성 코드가 지정되지 않은 경우 동일한 방식으로 처리 될 OR 조건 그룹으로 해석됩니다.

이를 통해 다음을 구성 할 수 있습니다.

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

다음 WHERE형식 의 절이 출력 됩니다.

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

addFieldToFilter :

모델이 DB 테이블에 직접 연결된 경우 이름으로 데이터베이스 열에 조건을 적용하려면 다음이 필요합니다.

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

Zend_Db_Expr :

훨씬 더 복잡한 구성의 경우을 사용하여 고유 한 where 절을 작성할 수 있습니다 Zend_Db_Expr. 예를 들면 :

$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)"));

출처 :

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

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


답장을 보내 주셔서 감사하지만 원하는 조건은 WHERE (CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))입니다. 위의 쿼리를 이미 게시했습니다.
Andhi Irawan

1
나는 당신이 사용할 수 있다고 지적했다 Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle

: 당신의 대답에 감사 philwinkle.base이 내가 addAttributeToFilter와 무슨 짓을했는지 샘플 AND 및 OR 조건 pastebin.com/ZznxLAai
Andhi 이르 완

결과를 생성 한 속성을 결정하는 방법이 있습니까? 나는 세 가지 분야에 걸쳐 사용자 정의 모델 모음을 검색하고 ( name, altnernate_name, description) 그 결과 때문에의 때를 알고 싶습니다 description속성.
pspahn

4

당신은 포함 할 경우 의 조합 또는 다음

$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' => ''
            )
        )
    );

2
귀하의 솔루션에 대해 +1이지만 정확히 반대가 필요합니다 (예 : WHERE (CONDITION_1 및 CONDITION_2) 또는 (CONDITION_3 및 CONDITION_4))), 도움을 줄 수 있습니까?
Haris

1

또는 addFieldToFilter를 사용하는 조건


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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.