【问题标题】:Database Structure For orders订单的数据库结构
【发布时间】:2017-08-03 00:46:02
【问题描述】:

我需要一些关于如何在我的数据库中编辑我的结构的想法我正在为 1 个外卖客户构建一个快餐订购网站,此时用户将那里的项目添加到订单表中

这是桌子:http://prntscr.com/g3o3kz

user_id 列是为订购 id 的用户存储的,然后 item id 是他们想要的项目 takeawayid 是外卖的 id 并且状态是他们是否订购食物,其自动设置为等待然后带走可以将其更新为接受或拒绝。

现在我遇到的问题是用户在上表中添加了 5 个项目作为外卖 id 1,用户 ID 将有 5 行,外卖 id 和项目 ID(有 5 个项目)

现在我进入了最近的订单页面,我打印了每个外卖的所有内容,就像这样

http://prntscr.com/g3o4uw

但是如果他们明天订购,它将添加另外 5 件商品,它会显示在同一个框中,我将如何对每个订单进行分组?所以订单 1 有 xyz 项目,然后下一次订单 order2 有 xyz 等等。因为目前数据库的布局方式如果有意义的话,它将都是 order1

显示订单框

<div class="container" style="margin-top: 40px;">
    <div class="row">
        <div class="col-xs-12">
            <?php
                echo $_SESSION['username'] ;




                    foreach ($ordersByUsers as $userId => $item) {
                        $username = $item['username'];
                        $ordersPrice = $item['ordersPrice'];
                        $orders = $item['orders'];





                        ?>
                        <div class="row">
                            <div class="col-xs-12 col-md-10" style="background-color: #FAFAF8; border: 1px solid #ddd; padding: 20px; margin-bottom: 20px;">
                                <div class="row" style="padding: 20px;">
                                    <div class="col-xs-12 col-sm-3">
                                        <div class="row">
                                            <a href="#">
                                                <img src="http://santetotal.com/wp-content/uploads/2014/05/default-user.png" class="img-responsive" alt="Restaurant logo" height="92" width="102">
                                            </a>
                                        </div>
                                        <div class="row" style="padding-top: 10px;">
                                            <a href="#" style="text-transform: uppercase;">
                                                 <a href="#" style="text-transform: uppercase;"> </a>
                                                <?php echo $username; echo "<br> </br>"; 
                                                 ?>



    <?php


/////////// get status of order
    $statement8 = $db->prepare("SELECT * FROM users WHERE username = ?  ");
$statement8->execute(array($_SESSION['username']));
$count8 = $statement8->fetch();

$username233 = mysql_real_escape_string($count8['id']);
 $username2312312 = strip_tags($username233);

    $statement85 = $db->prepare("SELECT * FROM orders WHERE user_id = ? AND takeawayid = ? ");
$statement85->execute(array($username2312312,$_SESSION['userid']));
$count84 = $statement85->fetch();



if($count84 ['status']== "waiting") {


?>


              <form action="dashboard.php" method="post">

                              <input type="hidden" name="accept" value="<?php echo $count84['id']?>">
                              <input type="image" name="submit" src="http://business.fsdfsdfsdf.com/beta/accept.png" border="0" alt="Submit" />
                     </p>

                              </form>





                                        <form action="dashboard.php" method="post">
                              <input type="hidden" name="deny" value="<?php echo $count84['id']?>">
                              <input type="image" name="submit" src="http://business.sdfsdfdf.com/beta/deny.png" border="0" alt="Submit" />
                     </p>

                              </form>







<?php
}elseif ($count84 ['status']== "Accepted") {
echo "<img src='http://business.sfdfsdfsdf.com/beta/accepted.png' alt='error'>";
} else {
                        echo "<img src='http://business.sdfdsfsdfsdf.com/beta/declined.png' alt='error'>" ;
}





    ?>                  






                                            </a>
                                        </div>
                                    </div>
                                    <div class="col-xs-12 col-sm-9">
                                        <?php
                                        foreach ($orders as $order) {
                                            $orderId = $order['orderId'];
                                            $itemname = $order['itemname'];
                                            $price = $order['price'];
                                            $date = $order['date'];
                                          $address = $order['address'];     



                                            ?>
                                            <div class="row">
                                                <div class="col-xs-12" style="background-color: #FFF; border: 1px solid #ddd; padding: 20px; margin-bottom: 20px;">
                                                    <h4>
                                                        <a href="profile.html" style="color: orange;">
                                                            <?php echo $itemname; ?>
                                                        </a>
                                                    </h4>
                                                    <div>
                                                        <div>
                                                            <span>
                                                                <?php echo $date; ?>
                                                            </span>
                                                        </div>
                                                        <div class="ratings">
                                                            <span>5 STARS</span>

                                                        </div>

                                                    </div>

                                                </div>
                                            Address:  <b> <?php echo $address; ?></b>
                                            </div>
                                            <?php
                                        }
                                        ?>
                                    </div>
                                </div>
                            </div>
                            <div class="col-xs-12 col-md-2" style="padding: 20px; padding-top: 40px; font-size: 20px; color: #666; text-transform: uppercase;">
                                Total: <?php echo $ordersPrice; ?>
                            </div>
                        </div>
                        <?php
                    }
                    ?>

查询

function fetchPaidOrdersByTakeaway($connection, $takeawayId, $paid) {
    if (!isset($takeawayId)) {
        throw new Exception('Takeaway ID not provided!');
    }

    if (!isset($paid)) {
        throw new Exception('Paid not provided!');
    }

    // Sql statement.
    $sql = 'SELECT 
                ord.id AS orderId,
                usr.id AS userId,
                usr.username,
                ord.itemname,
                ord.address,
                ord.price,
                ord.date
            FROM orders AS ord 
            LEFT JOIN users AS usr ON usr.id = ord.user_id 
            WHERE 
                user_id = :takeawayid 
                AND paid = :paid 
            ORDER BY 
                usr.username ASC,
                ord.date DESC';

    // Prepare and check sql statement (returns PDO statement).
    $statement = $connection->prepare($sql);
    if (!$statement) {
        throw new Exception('The SQL statement can not be prepared!');
    }

    // Bind values to sql statement parameters.
    $statement->bindValue(':takeawayid', $_SESSION['userid'], getInputParameterDataType($_SESSION['userid']));
    $statement->bindValue(':paid', $paid, getInputParameterDataType($paid));

    // Execute and check PDO statement.
    if (!$statement->execute()) {
        throw new Exception('The PDO statement can not be executed!');
    }

    // Fetch data.
    $fetchedData = $statement->fetchAll(PDO::FETCH_ASSOC);
    if ($fetchedData === FALSE) {
        throw new Exception('Fetching data failed!');
    }

    return $fetchedData;
}

/**
 * Group orders by users.
 * 
 * @param array $orders [optional] Orders list.
 * @return array Orders list grouped by users.
 * @throws Exception
 */
function groupOrdersByUsers(array $orders = array()) {
    $groupedOrders = array();

    foreach ($orders as $order) {
        $userId = $order['userId'];
        $username = $order['username'];
        $price = $order['price'];

        // Check and add user name as key, if not already.
        if (!array_key_exists($userId, $groupedOrders)) {
            $groupedOrders[$userId] = array(
                'username' => $username,
                'orders' => array(),
                'ordersPrice' => 0,
            );
        }

        // Add order to grouped orders list.
        $groupedOrders[$userId]['orders'][] = $order;
        $groupedOrders[$userId]['ordersPrice'] += $price;
    }

    return $groupedOrders;
}

我是否需要一个额外的列,可能是 orderid,然后让所有订单具有相同的 id,然后按订单 id 显示每个订单?问题是在订单中的每个项目中添加相同的数字,然后下一个订单添加一个新数字并且没有 2相同的数字

编辑 现在我像这样展示购物车

    $statement = $db->prepare("SELECT * FROM orders WHERE user_id = ? AND status = ? AND takeawayid = ? ");
// $statement->execute(array($username2,$md5password,$mod));

$statement->bindParam(1, $_SESSION['userid'], PDO::PARAM_STR, 50); // check your lengths
$statement->bindParam(2, $testing, PDO::PARAM_STR, 60);
$statement->bindParam(3, $id1, PDO::PARAM_INT);
$statement->execute();

这当然是完美的,因为旧订单将被接受或拒绝,因此等待状态的订单将是当前订单。我只是发现很难打印出旧订单并将它们组合在一起

【问题讨论】:

    标签: php database pdo


    【解决方案1】:

    了解如何为您的数据库实现third normal form

    这个神奇的短语只是意味着如果你有一些东西可能会被隔离为一个实体 - 为它创建一个单独的表。

    在您的情况下,应该有 1 个订单表和 1 个项目表,表将与 foreign keys 连接,在 Mysql 中按照那篇文章所述:MySQL foreign key examples (How to define foreign keys in MySQL)

    为了用合适的工具释放你的想象力,我建议你使用MySQL Workbench,这将帮助你在设计数据库结构时可视化它。在您的特定情况下,这可能是一种“麻雀大炮”的方法,但肯定会有助于您在未来快速提升技能。

    最后详细回答你的问题

    1. 使用idnameprice 字段创建items 表。它将包含您提供给用户的项目列表

      id 将是具有自动增量属性的主键

    2. 使用idname 字段创建users

      id 将是具有自动增量属性的主键

    3. 使用iduser_id 字段创建orders

      id 将是具有自动增量属性的主键

      user_id 将具有与用户表链接的外键

    4. 使用idorder_idpricequantity 字段创建order_items

      id 将是具有自动增量属性的主键

      order_id 将具有与订单表链接的外键

      item_id 将具有与项目表链接的外键

    我不明白地址和日期字段的用途,因此请附在上面列出的相应表格中。

    因此,您将获得每个用户的订单列表,其中包含与价格表相关的订购商品列表。您将能够一次从所有表中选择所有连接的数据或部分数据以将其显示给用户或您。

    这里的好处是,ID 不再有问题了。

    【讨论】:

    • 我有一个项目表prntscr.com/g3og1h 我正在尝试使用像 strutce 这样的论坛,如果外卖可以制作一个像披萨这样的类别,然后在里面有所有不同披萨的主题,所以我使用了一个类别表和一个主题表:)
    • 嗯,思路不变,方法和我上面说的一样)
    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多