私はこの数時間、これにこだわっています。 /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(Enterprise)を実行しています。ありがとう!
フィールドにor
条件を追加する別の方法があります。
->addFieldToFilter(
array('title', 'content'),
array(
array('like'=>'%$titlesearchtext%'),
array('like'=>'%$contentsearchtext%')
)
)
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'))
)
入れ子になった各配列(<condition>)は、OR条件に対して別の括弧のセットを生成します。
私も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時間立ち往生しました。
それが役立つことを願っています
これが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)))
複数の属性でフィルタリングするには、次のようなものを使用します。
//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
アンダのおかげで、あなたの投稿は大きな助けになりました!!しかし、OR文は私にとってはまったく機能せず、エラーが発生していました:getCollection() "foreachに無効な引数が指定されました"。
だから、これは私が終わったものです(この場合、属性が2ではなく3回指定されていることに注意してください):
$collection->addFieldToFilter('attribute', array(
array('attribute'=>'my_field1','eq'=>'my_value1'),
array('attribute'=>'my_field2','eq'=>'my_value2') ));
addFieldToFilterは最初にフィールドを必要とし、次に条件-> link。 を必要とします
ここでは少し混乱が生じていますが、はっきりさせてみましょう。
次のような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')))
これが本当の方法です:
$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
)
)
);
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%')))