Codeigniter - 将三个表组合成正确的视图格式

时间:2014-04-23 11:43:23

标签: php mysql codeigniter

完全混淆了如何实现某些目标 - 我有三张桌子;

  • 订单
  • 产品
  • 产品

订单表包含订单的详细信息,items表包含产品ID编号和订单ID编号,products表包含所有产品详细信息。

我要做的是拥有一个“我的订单”页面,您可以在其中查看所有过去的订单,以及我希望能够拥有以下结构......

订单

订单号1

  • 示例订单商品
  • 第二个示例订单商品
  • 第三个示例订单商品

订单号2

  • 示例订单商品
  • 第二个示例订单商品
  • 第三个示例订单商品

订单号3

  • 示例订单商品
  • 第二个示例订单商品
  • 第三个示例订单商品

现在我可以轻松列出所有订单,我可以列出特定订单上的所有项目,但我迷失了如何合并这三个表格,我可以用上面的格式列出它们,我假设我可以加入所有这三个,但我无法让它们以接近正确的方式输出。

有人知道这样做的好方法吗?非常感谢提前。

1 个答案:

答案 0 :(得分:1)

您可以使用已加入的查询来获取所有订单及其商品

/* raw sql query */
SELECT o.*,p.*,o.id AS order_id,p.id AS product_id
FROM  Orders o 
LEFT JOIN Items i ON (o.id=i.order_id)
LEFT JOIN Products p ON(p.id = i.product_id) 
ORDER BY order_id

在模型中创建一个函数并在查询

下运行
/* Using Active record */

$orders=$this->db->select('o.*,p.*,o.id AS order_id,p.id AS product_id')
                ->from(' Orders o ')
                ->join(' Items i','o.id=i.order_id','LEFT')
                ->join(' Products p','p.id = i.product_id','LEFT')
                ->order_by('order_id')
                ->get()
                ->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>';
}

这将输出为

<h1>ORDER NUMBER 1</h1>
    <p>product 1</p>
    <p>product 2</p>
<h1>ORDER NUMBER 2</h1>
    <p> product 3</p>

如果您有不同的html结构更改,我相应地使用标题和段落标记

提供了上述示例 您可以

编辑使用列表标记

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

这将输出为

<ul>
    <li>
        <h1>ORDER NUMBER 1</h1>
        <ul>
            <li><p>product 1</p></li>
            <li><p>product 2</p></li>
        </ul>
    </li>
    <li>
        <h1>ORDER NUMBER 2</h1>
        <ul>
            <li><p> product 3</p></li>
        </ul>
    </li>
</ul>