我正试图在应用程序中显示一个漂亮的“我的订单”页面 - 页面列表的每个订单都在一个框中,其中的所有项目都在它旁边。它是通过连接三个表(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中执行此操作或如何将其返回视图中的正确方法。
真的有点卡住了 - 以前有人在这里/做过那些并且想象我的错误吗?
答案 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>';
}
}
}