Php Magento addFieldToFilter:两个字段,匹配为或,非和
在过去的几个小时里,我一直被这个问题困扰着。我通过在Php Magento addFieldToFilter:两个字段,匹配为或,非和,php,magento,magento-1.9,Php,Magento,Magento 1.9,在过去的几个小时里,我一直被这个问题困扰着。我通过在/lib/Varien/Data/Collection/Db.php中修改几行代码来实现它,但我宁愿使用正确的解决方案,而不去触及我的核心 我所需要做的就是获取一个集合并按两个或多个字段对其进行筛选。比如说,customer\u firstname和remote\u ip。下面是我的代码(在没有黑客攻击的情况下不起作用Db.php): 我用一只股票Db.php,尝试了以下方法:(样本取自) 但这给了我一个错误: Warning: Illegal
/lib/Varien/Data/Collection/Db.php
中修改几行代码来实现它,但我宁愿使用正确的解决方案,而不去触及我的核心
我所需要做的就是获取一个集合并按两个或多个字段对其进行筛选。比如说,customer\u firstname
和remote\u ip
。下面是我的代码(在没有黑客攻击的情况下不起作用Db.php
):
我用一只股票Db.php
,尝试了以下方法:(样本取自)
但这给了我一个错误:
Warning: Illegal offset type in isset or empty in magento/lib/Varien/Data/Collection/Db.php on line 369
Warning: Invalid argument supplied for foreach() in magento/lib/Varien/Data/Collection/Db.php on line 412
如果我用try/catch将其包装,那么它将进入_getConditionSql(),并给出以下错误:
Warning: Illegal offset type in isset or empty in magento/lib/Varien/Data/Collection/Db.php on line 369
Warning: Invalid argument supplied for foreach() in magento/lib/Varien/Data/Collection/Db.php on line 412
有人有任何工作的、功能性的代码来做这件事吗?我正在运行Magento 1.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')
)
);
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')
)
... 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'))
)
有关更多信息,请查看:
我还尝试获取
字段1='a'或字段2='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());
它给了我
从abc中选择名称、关键字,其中的关键字如“%foo%”或其他关键字如“%bar%”
这可能不是“magento的方式”,但我在这方面被困了5个小时
希望它能有所帮助谢谢安达,你的帖子帮了大忙!! 然而,OR语句对我来说并不太有效,我犯了一个错误: getCollection()“为foreach提供的参数无效” 这就是我的结尾(注意属性被指定了3次,而不是本例中的2次):
addFieldToFilter首先需要一个字段,然后是条件->我有另一种方法在字段中添加
或条件:
->addFieldToFilter(
array('title', 'content'),
array(
array('like'=>'%$titlesearchtext%'),
array('like'=>'%$contentsearchtext%')
)
)
以下是我在Enterprise 1.11中的解决方案(应适用于CE 1.6):
这将导致以下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)))
这里有点混乱,但让我试着澄清一下:
假设您需要类似以下内容的sql:
//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')
)
);
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')
)
... 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'))
)
为了实现这一点,您的收藏需要按如下方式格式化:
$collection = Mage::getModel('enterprise_invitation/invitation')->getCollection();
$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));
$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
)
);
WHERE (((`status` = 'processing') OR (`status` = 'pending')))
现在,您可以使用
echo $collection->getSelect()->__toString();
或者可以生成如下条件:
$collection = Mage::getModel('enterprise_invitation/invitation')->getCollection();
$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));
$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
)
);
WHERE (((`status` = 'processing') OR (`status` = 'pending')))
这将生成一个SQL,其中的条件如下:
//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')
)
);
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')
)
... 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条件生成另一组括号。这是真正的magento方式:
$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
)
)
);
结果:
WHERE (((e.sku like 'a%') or (e.sku like 'b%')))
来源:要为收集创建简单或条件,请使用以下格式:
$orders = Mage::getModel('sales/order')->getResourceCollection();
$orders->addFieldToFilter(
'status',
array(
'processing',
'pending',
)
);
这将产生如下SQL:
$collection = Mage::getModel('enterprise_invitation/invitation')->getCollection();
$collection->addFieldToFilter(array('status', 'customer_id'), array(
array('status','eq'=>'new'),
array('customer_id', 'eq'=>'1234') ));
$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
)
);
WHERE (((`status` = 'processing') OR (`status` = 'pending')))
谢谢,安达。但这是为了要求两个字段,而不是一个或另一个。如果将->getSelectSql()添加到该查询的末尾,它将为您提供“…WHERE(my_field1='my_value1')和(my_field2='my_value2')”。我试图获取的是“WHERE(myfield1='myvalue1')或(myfield2='myvalue2')”。这仅适用于EAV集合中的addAttributeToFilter。Riyazkhan的答案是正确的。@1对于某个或某个条件不正确。我尝试了所有答案,这是唯一对我有效的答案。Anda对OR的回答是试图搜索一个名为“attribute”的属性,所以我不断得到未知列“attribute”错误。其他解决方案具有正确的列名,但没有值。这在SQL中为我提供了正确的结果:。。。其中('first_attribute'='some value')或('second_attribute'='some value'))
尝试这种方法我找不到一列:1054在'WHERE子句'error'中未知列'Array',请注意此语法对于addAttributeToFilter不正确,这也是我所知道的最好的解决方案。几个小时以来,我一直在尝试让一个复杂的查询用于定制资源模型。这就是最终成功的原因。谢谢。这样做的原因是它使用第一个参数(字段数组)中的键查找第二个参数(条件数组)中用于该字段的值。我发现这样做会更清楚一些:$collection->addFieldToFilter(数组('field_1'=>'field_1','field_2'=>'field_2')、数组('field_1'=>数组('in'=>数组('text_1','text_2','text_3')、数组('like'=>'%text'))、'field_2'=>数组('eq'=>'exact'));
此筛选器实际上适用于或条件。谢谢!请注意,此语法对于addAttributeToFilter不正确,请参阅stackoverflow.com/a/5301457/3338098了解该语法