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


Codeigniter - Combining Three tables into correct view format

对如何实现目标完全困惑——我有三个表;

  • 订单
  • 项目
  • 产品

订单表包含订单的详细信息,项目表包含产品id号和订单id号,产品表包含所有产品详细信息。

我想做的是有一个"我的订单"页面,在那里你可以查看你过去的所有订单,我希望能够有以下结构。。。

订单

订单号1

  • 订单项目示例
  • 订单项目的第二个示例
  • 第三个订单项目示例

订单号2

  • 订单项目示例
  • 订单项目的第二个示例
  • 第三个订单项目示例

订单号3

  • 订单项目示例
  • 订单项目的第二个示例
  • 第三个订单项目示例

现在我可以很容易地列出所有的订单,也可以列出特定订单上的所有项目,但我不知道如何以上面的格式列出这三个表,我假设我可以对所有三个表进行JOIN,但我无法以接近正确的方式输出它们。

有人知道做这件事的好方法吗?非常感谢。

您可以使用联接查询来获取所有订单及其商品

/* 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>