【问题标题】:Array of colors for products with table association in CodeIgniterCodeIgniter 中具有表关联的产品的颜色数组
【发布时间】:2014-04-03 14:22:49
【问题描述】:

我的应用中有这三个表:

table: products
columns: id, name, price

table: colors
columns: id, name, products_count

table: product_colors
columns: id, product_id, color_id

就我而言,一个产品可以有多种颜色。这是我用来获取产品的查询:

SELECT products.id, products.name, products.price
FROM products

那么,如何通过数组获取特定产品的所有颜色?像这样的:

SELECT products.id, products.name, products.price, colors.name color
FROM products
LEFT JOIN product_colors ON product_colors.product_id = products.id
INNER JOIN colors ON colors.id = product_colors.color_id

上面的语法是怎么回事?

colors.name 列只检索一种颜色。

在 PHP/CodeIgniter 中我只想这样做:

view.php:

<h1><?php echo $product->name; ?></h1>
<div class="colors">
    Colors available:
    <?php foreach ($product->colors as $color) { ?>
        <?php echo $color->name; ?>
    <?php } ?>
</div>

这可以使用本机 CodeIgniter 执行吗?我的意思是,没有 Doctrine 或其他 ORM?

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    你可以使用GROUP_CONCAT

    最终的查询看起来像这样:

    SELECT products.id, products.name, products.price, GROUP_CONCAT(colors.name ORDER BY colors.name SEPARATOR '+') colors
    FROM products
    LEFT JOIN product_colors ON product_colors.product_id = products.id
    INNER JOIN colors ON colors.id = product_colors.color_id
    GROUP BY products.id
    

    然后在你的结果输出中:

    [...]
    $colorArray = explode("+", $product->colors); //this is your array of color names.
    

    您可以使用 CodeIgniter 的 Active Record 来编写它。但是,它可能会导致大量数据出现性能问题。

    【讨论】:

    • 我想使用 GROUP_CONCAT,但同时我猜这根本不是一个好习惯。但是,如果没有其他方法可以在没有任何 ORM 的情况下雕刻这个机制,那好吧,那我们走吧。顺便问一下,解决性能问题的最佳选择是什么?
    • 是的,应该这样做,不需要这样做foreach ($product-&gt;colors as $color) 直接使用$product-&gt;colors 访问它只需要拆分它需要显示的方式!
    • @AbhikChakraborty 实际上,我需要分解颜色,因为我将使用它们执行一些复杂的任务。我的意思是,它不仅仅是处理或显示——还有一些比这更多的东西,比如 JavaScript 控件和操作。
    • 这是 2 种相同的查询 sqlfiddle.com/#!2/dd3e4f/1 与 @Aidas 添加的查询。
    • @AbhikChakraborty Aidas 的那个是最好的?
    猜你喜欢
    • 2014-06-29
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多