0

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

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

提前谢谢了

4

3 回答 3

2

您是否尝试过以下操作:

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

如果您从后变量中获取这些值:

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

PHP intval - 手册

于 2013-06-13T21:54:27.333 回答
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 或自己浮动。

于 2013-06-13T22:33:35.733 回答
0

确实数组中的值不是整数

解决了我的以下问题:

    $arrayVar = array_map('intval',Mage::app()->getRequest()->getParam('param'));
    .....
于 2013-06-13T22:57:08.440 回答