我正在尝试在应用程序中显示一个漂亮的“我的订单”页面-页面列表中的每个订单都在一个框中,旁边是按顺序排列的所有项目。这是通过连接三个表(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(); }
这会将每一行作为单独的结果返回,因此我在视图中使用类似以下内容来分隔orders…
$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分页函数时遇到了问题,该函数需要知道返回的记录(订单)的总数,以便计算链接,但一个订单框可能是5个记录(1个订单记录,然后是4个项目),因此它不起作用。
我认为从视图…中调用items查询非常容易(但很糟糕)所以我不想这么做。我在想,一定有一种方法可以将SQL结果转换为更合适的数组结构,其中每个order都包含一个带有项…的子数组但是我不知道如何在MYSQL中做到这一点,或者如何在视图中以正确的方式返回它。
真的有点卡住了--有没有人以前在这里/做过,想告诉我我的方式的错误?
发布于 2014-05-05 17:33:29
您可以使用,它会用逗号分隔与某个特定订单相关的所有产品,但在此之前使用过
要注意这一事实,它默认限制为1024个字符,但可以增加,这是在手册中定义的
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();
}然后,从上面的查询中,您可以使用explode函数获得产品,从上面的查询中,您可以获得所需的所有订单的计数,以便使用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>';
}
}
}https://stackoverflow.com/questions/23467925
复制相似问题