我在数据库表中有一个字段,用于存储1,2,3,4之类的值 我加载了如下的集合
$arrayVar[] = '1';
$arrayVar[] = '4';
$collection->addFieldToFilter('field_name', array('in' => array($arrayVar)));
现在,上面的集合应该能够返回包含值1,2,3,4的字段,但它不会,因为magento集合生成的查询是
Select * from table where (field_name in ('1','4'));
我需要的正确查询如下,没有引号:
Select * from table where (field_name in (1,4));
有没有人有任何建议我应该如何阅读不需要的报价?
非常感谢提前
答案 0 :(得分:2)
您是否尝试过以下操作:
$arrayVar[] = 1;
$arrayVar[] = 4;
如果从帖子变量中获取这些值:
$arrayVar[] = intval($_POST['var1']);
$arrayVar[] = intval($_POST['var2']);
答案 1 :(得分:1)
简答:不,并且没有理由(如果我第二次错了,你的帖子中的更多细节可以帮助别人解决你的问题)
我认为在翻译中可能会丢失一些内容,所以如果错过了标记,请提前道歉。
您无法从查询中删除这些引号,因为MySQL(或您正在使用的任何数据库引擎)都需要这些引号。
如果您将整数传递给过滤功能,Magento将按您的意愿运行。以下
$c = Mage::getModel('cms/page')->getCollection()
->addFieldToFilter('page_id', array('in'=>array(1,2,3)));
echo $c->getSelect();
将为您提供一个类似于
的SQL查询SELECT `main_table`.* FROM `cms_page` AS `main_table` WHERE (entity_id IN(1, 2, 3))
但是,一旦使用字符串,数据库生成代码就需要用引号括起这些参数。请考虑以下
生成看起来像这样的SQL。
SELECT `main_table`.* FROM `cms_page` AS `main_table` WHERE (page_id IN('one', 'two', 'three'))
如果没有引用行为,将生成如下的SQL,
WHERE (page_id IN(one, two, three))
这是无效的SQL。
关键是数据库生成代码没有高效或安全的方法来判断字符串是1
之类的数字字符串,还是像one
这样的字。所以它引用所有字符串。
它也无所谓,因为MySQL具有魔力,以至于以下查询行为相同(如果您使用EE和其他一些数据库驱动程序,则可能不是这样)
SELECT `main_table`.* FROM `cms_page` AS `main_table` WHERE (page_id IN(1, 2, 3))
SELECT `main_table`.* FROM `cms_page` AS `main_table` WHERE (page_id IN('1', '2', '3'))
如果您一心想要删除这些引号,则需要将任何变量转换为int或者自己浮动。
答案 2 :(得分:0)
实际上,数组中的值不是整数
通过以下方式解决了我的问题:
$arrayVar = array_map('intval',Mage::app()->getRequest()->getParam('param'));
.....