45

私はここ数時間これにこだわっています。で数行をハックして動作させました/lib/Varien/Data/Collection/Db.phpが、適切なソリューションを使用して、コアをそのままにしておきたいと思います。

必要なのは、コレクションを取得して、2 つ以上のフィールドでフィルター処理することだけです。customer_firstnameと言うremote_ip。これが私の(ハッキングなしで機能しない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 (エンタープライズ) を実行しています。ありがとう!

4

10 に答える 10

77

orフィールドに条件を追加する別の方法があります。

->addFieldToFilter(
    array('title', 'content'),
    array(
        array('like'=>'%$titlesearchtext%'), 
        array('like'=>'%$contentsearchtext%')
    )
)
于 2011-10-21T15:42:33.773 に答える
27

OR 条件は次のように生成できます。

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

これにより、次のような SQL WHERE 条件が生成されます。

... 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 条件に対して別の括弧のセットを生成します。

于 2013-03-20T04:40:05.203 に答える
16

私も手に入れてみました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時間立ち往生していました.

それが役立つことを願っています

于 2011-03-11T00:34:10.237 に答える
13

Enterprise 1.11での私のソリューションは次のとおりです(CE 1.6で動作するはずです):

    $collection->addFieldToFilter('max_item_count',
                    array(
                        array('gteq' => 10),
                        array('null' => true),
                    )
            )
            ->addFieldToFilter('max_item_price',
                    array(
                        array('gteq' => 9.99),
                        array('null' => true),
                    )
            )
            ->addFieldToFilter('max_item_weight',
                    array(
                        array('gteq' => 1.5),
                        array('null' => true),
                    )
            );

この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)))
于 2012-07-20T13:24:12.907 に答える
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')
            )
        );

詳細については、http: //docs.magentocommerce.com/Varien/Varien_Data/Varien_Data_Collection_Db.html#_getConditionSqlを確認してください。

于 2010-09-30T07:46:07.903 に答える
8

アンダに感謝します、あなたの投稿は大きな助けになりました!しかし、OR文は私にはうまく機能せず、エラーが発生していました: getCollection()"foreachに無効な引数が指定されました"

これが私が終了したものです(この場合、属性が2回ではなく3回指定されていることに注意してください)。

  $collection->addFieldToFilter('attribute', array(  
    array('attribute'=>'my_field1','eq'=>'my_value1'),            
    array('attribute'=>'my_field2','eq'=>'my_value2') ));

addFieldToFilterは最初にフィールドを必要とし、次に条件->リンクを必要とします。

于 2011-05-13T06:58:47.273 に答える
5

ここで少し混乱が生じていますが、はっきりさせておきます。

次のような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();
于 2012-12-19T20:11:29.107 に答える
2

これは本当のマジェントの方法です:

    $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
                                )
                            )
                        );
于 2013-06-03T15:59:20.513 に答える
2
public function testAction()
{
        $filter_a = array('like'=>'a%');
        $filter_b = array('like'=>'b%');
        echo(
        (string) 
        Mage::getModel('catalog/product')
        ->getCollection()
        ->addFieldToFilter('sku',array($filter_a,$filter_b))
        ->getSelect()
        );
}

結果:

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

ソース: http://alanstorm.com/magento_collections

于 2015-07-10T06:37:03.997 に答える
2

コレクションの単純な OR 条件を作成するには、次の形式を使用します。

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

これにより、次のような SQL が生成されます。

WHERE (((`status` = 'processing') OR (`status` = 'pending')))
于 2016-09-06T05:39:33.230 に答える