我正在尝试为CodeIgniter上编写的网站编写搜索功能,但是模型中的连接语句有问题。
控制器将搜索条件数组传递给模型函数:get_sales($ search_criteria);
function get_sales($search_criterie){
$this->db->join('sales_prices', 'sales_prices.sale_id = sales.sale_id', 'left');
$this->db->join('sales_sizes', 'sales_sizes.sale_id = sales.sale_id', 'left');
$query = $this->db->get_where('sales', $search_criterie);
$sale_data = $query->result_array();
}
我遇到两个问题:
1)我在sales_sizes连接中需要一个WHERE子句。现在它加入sales_sizes.sale_id ON sales.sale_id但我希望能够通过$ search_criteria数组按大小过滤。我怎么能这样做?
2)每个销售通常都有多种尺寸,我希望查询的输出格式为:
Array
(
[sale_id] => 1
[sale_category] => shoes
[sale_price] => 29.99
[sale_sizes] => Array
(
[0] => 10
[1] => 10.5
[2] => 11
)
)
我已经尝试了一些foreach循环来格式化输出但无法使其工作。希望有人可以提供帮助。
更新
如何将以下查询结果处理为上述格式?
Array
(
[0] => Array
(
[sale_id] => 1
[sale_category] => shoes
[sale_price] => 29.99
[sale_size] => 10
)
[1] => Array
(
[sale_id] => 1
[sale_category] => shoes
[sale_price] => 29.99
[sale_size] => 10.5
)
[2] => Array
(
[sale_id] => 1
[sale_category] => shoes
[sale_price] => 29.99
[sale_size] => 11
)
)
答案 0 :(得分:1)
我个人并不是使用活动记录的忠实粉丝。我发现它经常限制程序员编写更复杂的查询。如果您发现这也是正确的,您可以按照以下步骤重写您的查询:
$this->db->query('SELECT * FROM `sales_prices`, `sales_sizes` WHERE `sales_prices`.`sale_id` = `sales`.`sale_id` AND `sales_sizes`.`sale_id` = `sales`.`sale_id` AND `sales` = ?', array($search_criterie));
$sale_data = $query->results();
这将生成相同的结果,并且还会参数化您的查询。请注意,问号对应于数组中的值,这些值将构成您$this->db->query()
函数的第二个参数。
答案 1 :(得分:0)
尝试此类查询
$this->db->select('places.*, category.*')
->from('places')
->join('category', 'places.category_id = category.category_id', 'left')
->join('places_reviews', 'places_reviews.place_id = places.id', 'left')
->where('places.category_id', $category_id)
->limit($limit, $offset)
->order_by($sort_by, $sort_order);
答案 2 :(得分:0)
下面的解决方案将为您工作,它不会生成确切的输出,但是非常接近输出。
$this->db->select('sales.*, GROUP_CONCAT(DISTINCT sales_prices.sale_id) as sales_price GROUP_CONCAT(DISTINCT sales_sizes.sale_id) as sales_size')
这将为您生成一个逗号分隔的值。