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

问题描述 投票:3回答:2

我正在使用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是以逗号分隔的列表

profiler的输出是:

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\'')

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

php mysql codeigniter activerecord
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

© www.soinside.com 2019 - 2024. All rights reserved.