Magento addFieldToFilter:两个字段,匹配为 OR,而不是 AND
过去几个小时我一直坚持这个问题。我通过修改 /lib/Varien/Data/Collection/Db.php
中的几行来让它工作,但我宁愿使用正确的解决方案并保持我的核心不变。
我需要做的就是获取一个集合并按两个或多个字段对其进行过滤。例如,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< /a>)
$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(企业版)。谢谢!
I've been stuck on this for the last few hours. I got it working by hacking a few lines in /lib/Varien/Data/Collection/Db.php
, but I'd rather use the proper solution and leave my core untouched.
All I need to do is get a collection and filter it by two or more fields. Say, customer_firstname
and remote_ip
. Here's my (disfunctional without hacking Db.php
) code:
$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)));
With a stock Db.php
, I tried this: (sample taken from 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'),
));
But that gives me this error:
Warning: Illegal offset type in isset or empty in magento/lib/Varien/Data/Collection/Db.php on line 369
If I wrap that with a try/catch, then it moves into _getConditionSql() and gives this error:
Warning: Invalid argument supplied for foreach() in magento/lib/Varien/Data/Collection/Db.php on line 412
Does anyone have any working, functional code for doing this? I'm running Magento 1.9 (Enterprise). Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
我有另一种方法可以在字段中添加
or
条件:I've got another way to add an
or
condition in the field:OR 条件可以这样生成:
这将生成一个 SQL WHERE 条件,如下所示:
每个嵌套数组 () 为 OR 条件生成另一组括号。
OR conditions can be generated like this:
This will generate an SQL WHERE condition something like:
Each nested array(<condition>) generates another set of parentheses for an OR condition.
我还尝试获取
field1 = 'a' OR field2 = 'b'
您的代码对我不起作用。
这是我的解决方案,
它为我提供了
SELECT name, keywords FROM abc WHERE keywords like '%foo%' OR extra_keywords like '%bar%'
。这可能不是“magento 的方式”,但我在这上面花了 5 个小时。
希望它会有所帮助
I also tried to get the
field1 = 'a' OR field2 = 'b'
Your code didn't work for me.
Here is my solution
It gives me
SELECT name, keywords FROM abc WHERE keywords like '%foo%' OR additional_keywords like '%bar%'
.It is maybe not the "magento's way" but I was stuck 5 hours on that.
Hope it will help
这是我在 Enterprise 1.11 中的解决方案(应该在 CE 1.6 中工作):
其结果是以下 SQL:
Here is my solution in Enterprise 1.11 (should work in CE 1.6):
Which results in this SQL:
要按多个属性进行过滤,请使用类似以下内容的内容:
有关详细信息,请检查:
http://docs.magentocommerce.com/Varien/Varien_Data/Varien_Data_Collection_Db.html#_getConditionSql
To filter by multiple attributes use something like:
For more information check:
http://docs.magentocommerce.com/Varien/Varien_Data/Varien_Data_Collection_Db.html#_getConditionSql
谢谢安达,你的帖子很有帮助!
然而 OR 语句对我来说不太有效,我收到了一个错误:
getCollection()“为 foreach 提供的参数无效”。
所以这就是我最后的结果(注意在本例中属性被指定了 3 次而不是 2 次):
addFieldToFilter 首先需要一个字段,然后条件 -> 链接。
Thanks Anda, your post has been a great help!!
However the OR sentence didnt' quite work for me and I was getting an error:
getCollection() "invalid argument supplied for foreach".
So this is what I ended with (notice the attribute being specified 3 times instead of 2 in this case):
addFieldToFilter first requires a field and then condition -> link.
这里有一些混乱,但让我尝试澄清一下:
假设您想要看起来像这样的 sql:
为了实现这一点,您的集合需要像这样格式化:
现在看看它是什么样子的您始终可以通过使用回显创建的查询
There is a bit of confusion going on here, but let me try to clarify things:
Lets say you wanted sql that looked something like:
In order to achieve this, your collection needs to be formatted like this:
Now to see what this looks like you can always echo the query that this creates by using
这是真正的magento方式:
This is the real magento way:
结果:
来源:http://alanstorm.com/magento_collections
Result:
Source: http://alanstorm.com/magento_collections
要为集合创建简单的 OR 条件,请使用以下格式:
这将生成如下 SQL:
To create simple OR condition for collection, use format below:
This will produce SQL like this: