[英]Getting specific products from database with one-to-many relationship
我正在使用 mySQL 和 PHP 框架制作产品目录 Codeigniter 4. 这里我将展示一个简化的示例。 我的数据库中有两个表。 一个有产品名称和价格等通用数据。 另一个有颜色、材料等各种属性。所以一个产品有很多属性。 像这样的东西:
产品
| 编号—— | 名称 ----- | 价格 -- |
| 0 --- | 椅子 1 -- | 50 ----- |
| 1 --- | 主席 2 -- | 75 ----- |
属性
| 编号—— | 产品编号——| 属性——| 价值——|
| 0 --- | 0 ---------- | 颜色 ------ | 黑色——|
| 1 --- | 0 ---------- | 尺寸 -------- | 小—— |
| 2 --- | 1 ---------- | 颜色 ------ | 白色—— |
| 3 --- | 1 ---------- | 尺寸 -------- | 大—— |
我的问题涉及获取特定产品,因为当有产品过滤器并且用户想要查看具有特定属性的所有产品时。 如果我需要获得具有一种属性的一种产品,我对此没有问题。 我这样做:
$product = $productsModel->join('attributes', 'attributes.product_id = products.id')
->where('attribute', 'color')
->where('value', 'black')
->find();
但是我无法根据多个属性获取产品。 就像如果我需要一把黑色和小的椅子,我不能添加->where('attribute', 'size')->where('value', 'small')
因为颜色和尺寸是不同的行。 很容易看出我是否使用相同的join并尝试获取id为0的产品。结果是:
Array
(
[0] => Array
(
[id] => 0
[name] => Chair 1
[price] => 50
[product_id] => 1
[attribute] => color
[value] => black
)
[1] => Array
(
[id] => 1
[name] => Chair 1
[price] => 50
[product_id] => 0
[attribute] => size
[value] => small
)
)
知道如何解决这个问题吗? 我需要创建一个带有复选框的过滤器,该过滤器将显示产品的所有可用属性并允许用户搜索任何组合。
在原始 MySQL 中,您当前的查询为:
SELECT products.*
FROM products
INNER JOIN attributes ON attributes.product_id = products.id
WHERE attribute = 'color' AND value = 'black';
添加第二个连接看起来像这样:
SELECT P.*
FROM products AS P
INNER JOIN attributes AS A1 ON A1.product_id = P.id
INNER JOIN attributes AS A2 ON A2.product_id = P.id
WHERE A1.attribute = 'color' AND A1.value = 'black' AND
A2.attribute = 'size' AND A2.value = 'small';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.