从控制器传递逗号分隔的列表到模型

3

我正在使用Codeigniter,并尝试从控制器将逗号分隔的列表传递到模型中,以在where_not_in查询中使用。我有以下代码来创建逗号分隔的列表。

$mnames = Array();
foreach($facet_group['manufacturer_name'] as $u) $mnames[] = $u['value'];
$manufacturer_list = implode(",",$mnames);

以下是输出结果:阿尔卡特,苹果,华为,LG,微软,摩托罗拉,诺基亚,三星,索尼。我的问题是:

$this->db->select('name');
$this->db->from('wl_manufacturers');
$this->db->where('active', 1);
$this->db->where('supplier_type', 'product');
$this->db->where_not_in('name', $str);
$str 是逗号分隔的列表。
探查器的输出如下:
SELECT `name`
FROM `wl_manufacturers`
WHERE `active` = 1
AND `supplier_type` = 'product'
AND `name` NOT IN('Alcatel,Apple,Huawei,LG,Microsoft,Motorola,Nokia,Samsung,Sony')

这似乎不起作用,因为列表中的每个项目周围没有单引号。 但是,如果我像这样手动创建列表:$array = array('Alcatel','Apple','Huawei','LG','Microsoft','Motorola','Nokia','Samsung','Sony')。 它可以工作,并且来自分析器的输出如下:

SELECT `name`
FROM `wl_manufacturers`
WHERE `active` = 1
AND `supplier_type` = 'product'
AND `name` NOT IN('Alcatel', 'Apple', 'Huawei', 'LG', 'Microsoft', 'Motorola', 
'Nokia', 'Samsung', 'Sony')

在将逗号分隔的列表项传递到模型之前,我尝试给每个项添加单引号:

$str = "'" . implode ( "', '", $mnames ) . "'";

但是分析器输出的结果是这样的:
SELECT `name`
FROM `wl_manufacturers`
WHERE `active` = 1
AND `supplier_type` = 'product'
AND `name` NOT IN('\'Alcatel\', \'Apple\', \'Huawei\', \'LG\', \'Microsoft\', 
\'Motorola\', \'Nokia\', \'Samsung\', \'Sony\'')

由于已添加反斜杠,所以再次不起作用。因此问题是如何创建逗号分隔的列表,将其传递给我的模型,并使查询正常工作?

2个回答

1
你需要将逗号分隔的字符串($str)拆分成数组。
$arr=explode (',',$str)

然后你可以像这样在查询中使用它:
$this->db->where_not_in('name', $arr);

查看explode: 以及CI的where_not_in()


0

看起来 $this->db->where_not_in 希望得到一个值的数组... 或者,如果传入的是字符串,则与传递一个只有一个项目的数组相同。

因此,如果您从一个数组开始,请将其直接传递给 where_not_in。但是,如果您从一个 CSV 字符串开始,则使用 str_getcsv(my_string_of_csv) 将其转换为数组,然后将该数组传递给 where_not_in

注意:如果您的 CSV 字符串可能包含空格、转义字符和/或带引号的值,则应使用 str_getcsv 而不仅仅是 explode。请参见:http://php.net/manual/en/function.str-getcsv.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接