如何遍历外键数据库以将项目拆分为多个部分

时间:2016-12-14 14:32:15

标签: php loops iteration

这就是我的数据库的结构:

product_types

名称(文字字段)

description(文本字段)

菜单

姓名(文字)

价格(文字)

product_type_id(产品类型表的外键)

我希望能够做的是遍历product_type表并显示菜单表中包含该产品类型的所有项目。

我想这样做,所以我可以将项目分成几个部分,例如product_type表格将包含“食物”,“饮料”等项目。

到目前为止,这是我的代码,它所做的只是从菜单表中获取每个项目:

<?php
    $result = $connection->query("SELECT * FROM menu");
    // print " Query returned ". $result->num_rows . " rows ";; 
    while($row = $result->fetch_assoc()) {
?> 

    <p><? echo $row["name"]; ?></p>
    <p><? echo $row["description"]; ?></p>
    <p><? echo $row["price"]; ?></p>
    <hr>
<?php 
    }; 
?>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

就个人而言,我的编程很多都是关于可读性的。我最大的烦恼之一就是看到编写糟糕的代码,既没有标签结构也没有一致的缩进风格。对于下面的示例,您将看到我使用了关联Multidimensional Array来按产品类型组织菜单项。我们使用JOIN Syntax构建查询,以使用product_type_id组合两个表。在MySQL中,JOINCROSS JOININNER JOIN是语法等价物(它们可以互相替换)。在标准SQL中,它们不等效。 INNER JOINON子句一起使用,否则使用CROSS JOIN。菜单项已在查询中排序,如果您未在查询中对结果进行排序,我建议通过ksort()对数组进行排序,因为我们使用产品类型作为索引。最后,由于我们将HTML集成到PHP中,我强烈建议使用alternative syntax作为控制结构。作为后备,我可以检查数组是否为空,以确定我们是否有任何结果。默认文本总是比空白页面好:

<?php
    /* Fetch Menu Items */
    $menu_items = array();
    $sql = "SELECT `product_types`.`name` AS 'product_type', `product_types`.`description`, `menu`.`name`, `menu`.`price` FROM `menu` JOIN `product_types` ON `product_types`.`id` = `menu`.`product_type_id` ORDER BY `product_types`.`name`";
    $query = $connection->query($sql);
    while($row = $query->fetch_assoc()) {
        $menu_items[$row['product_type']][] = $row;
    }
?> 

<?php if(!empty($menu_items)): ?>
    <?php foreach($menu_items as $product_type => $items): ?>
        <h2><?php echo $product_type; ?></h2>
        <?php foreach($items as $item): ?>
            <p><?php echo $item['name']; ?></p>
            <p><?php echo $item['description']; ?></p>
            <p><?php echo $item['price']; ?></p>
            <hr>
        <?php endforeach; ?>
    <?php endforeach; ?>
<?php else: ?>
    <p>Sorry. No menu items to display at this time. Please check back soon!
<?php endif; ?>

答案 1 :(得分:0)

试试这个:

$result = $connection->query("SELECT m.name, m.price, p.id as productTypeId, p.name as productType, p.description FROM menu inner join product_types p on m.product_type_id = p.id order by p.id");
$productType = null;

while($row = $result->fetch_assoc()) {

    if ( $row['productTypeId'] != $productType ){
        $productType = $row['productTypeId'];
        echo "<h2>$row['productType']</h2>";
    }

    ?>

    <p><? echo $row["name"]; ?></p>
    <p><? echo $row["description"]; ?></p>
    <p><? echo $row["price"]; ?></p>
    <hr>
    <?php
};