addAttributeToFilterのマルチ条件(ANDおよび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)))のような条件を作成することです。上記のクエリは既に投稿しています。
アンディイラワン

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 Irawan

どの属性が結果を生成したかを判断する方法はありますか?私は三つのフィールド全体でのカスタムモデルのコレクションを探しています(namealtnernate_namedescription)と結果が原因である場合に知っていただきたいと思いdescription属性。
pspahn

4

ANDORの組み合わせを含める場合は、

$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が、私は全く逆、すなわち(CONDITION_1そしてCONDITION_2)OR(CONDITION_3とCONDITION_4は)))、あなたが助けをしてくださいすることができます必要がある
ハリス

1

またはaddFieldToFilterを使用した条件


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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.