magento'in'条件?

时间:2013-06-13 21:52:46

标签: mysql magento collections

我在数据库表中有一个字段,用于存储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));

有没有人有任何建议我应该如何阅读不需要的报价?

非常感谢提前

3 个答案:

答案 0 :(得分:2)

您是否尝试过以下操作:

$arrayVar[] = 1;
$arrayVar[] = 4;

如果从帖子变量中获取这些值:

$arrayVar[] = intval($_POST['var1']);
$arrayVar[] = intval($_POST['var2']);

PHP intval - Manual

答案 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'));
    .....