1

我正在尝试为 CodeIgniter 上编写的网站编写搜索功能,但模型中的 join 语句有问题。

控制器将一组搜索条件传递给模型函数: 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    
        )

) 
4

3 回答 3

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()函数的第二个参数。

于 2012-10-05T19:45:06.523 回答
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);
于 2012-10-05T19:10:19.083 回答
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')

这将为您生成一个逗号分隔的值。

于 2019-10-16T18:26:35.187 回答