Codeigniter MYSQL连接返回单个记录?

时间:2014-05-05 08:20:36

标签: php mysql codeigniter

我正试图在应用程序中显示一个漂亮的“我的订单”页面 - 页面列表的每个订单都在一个框中,其中的所有项目都在它旁边。它是通过连接三个表(Orders,Items,Products)来完成的,items表有一个product_id和一个order_id等。这里的一个小伙伴帮我处理了原始代码,下面是模型函数:

function get_all_orders() {
    $this->db->select('o.*,p.*,i.*,o.order_id AS order_id,p.product_id AS product_id, i.item_id as item_id');
    $this->db->from('Orders o');
    $this->db->join('Items i','o.order_id = i.order_id','left');
    $this->db->join('Products p','p.product_id = i.product_id','left');
    $this->db->order_by('o.order_id', 'desc');   
    $query = $this->db->get();
    return $query->result();                  

}

这会将每一行作为单独的结果返回,所以我在视图中使用这样的东西来分隔订单......

$currentParent = false;
foreach ($orders as $o) {
    if ($currentParent != $o->order_id) {
        echo '<h1>ORDER NUMBER ' . $o->order_id . '</h1>';
        $currentParent = $o->order_id;
    }
    echo '<p>' . htmlentities($o->product_name) . '</p>';
}

但现在我遇到了尝试使用Codeigniter分页功能的问题,该功能需要知道返回的记录(订单)总数,以便计算链接,但一个Order框可能是5条记录(1订单记录然后4项)所以它不起作用。

我认为从视图中调用项目查询会非常容易(但很糟糕)...所以我不想这样做。我认为必须有一种方法可以将SQL结果转换为更合适的数组结构,其中每个订单都包含带有项目的子数组......但我不知道如何在MYSQL中执行此操作或如何将其返回视图中的正确方法。

真的有点卡住了 - 以前有人在这里/做过那些并且想象我的错误吗?

1 个答案:

答案 0 :(得分:0)

您可以使用GROUP_CONCAT(),它会以逗号分隔与一个特定订单相关的所有产品,但在此之前使用此产品

  

要知道它的默认限制为1024个字符   concat但可以增加,这在手册

中定义
function get_all_orders() {
    $this->db->select('o.*,o.order_id AS order_id,
    GROUP_CONCAT(p.product_name ORDER BY p.id) products,
    GROUP_CONCAT(p.id ORDER BY p.id) product_ids
   ',FALSE);
    $this->db->from('Orders o');
    $this->db->join('Items i','o.order_id = i.order_id','left');
    $this->db->join('Products p','p.product_id = i.product_id','left');
    $this->db->group_by('o.order_id');   
    $this->db->order_by('o.order_id', 'desc');   
    $query = $this->db->get();
    return $query->result();
}

然后从上面的查询中你可以通过使用爆炸功能获得产品,从上面的查询中你可以得到所有订单的所需数量,以便使用CI的分页类,现在在你的视图中你的数据显示代码会是这样的

foreach ($orders as $o) {        
    echo '<h1>ORDER NUMBER ' . $o->order_id . '</h1>';
    $products=explode(',',$o->products);
    if(!empty($products)){
      foreach ($products as $p) {
            echo '<p>' . htmlentities($p) . '</p>';
      }
    }

}