【发布时间】:2021-10-17 18:55:52
【问题描述】:
我正在使用 mySQL 和 PHP 框架 Codeigniter 4 制作产品目录。这里我将展示一个简化的示例。我的数据库中有两个表。一个具有通用数据,例如产品名称和价格。另一种具有各种属性,例如颜色,材料等。因此,一种产品具有许多属性。类似的东西:
产品
|身份证——|姓名 ----- |价格——|
| 0 --- |椅子 1 -- | 50 ----- |
| 1 --- |椅子 2 -- | 75 ----- |
属性
|身份证——| product_id -- |属性 -- |价值——|
| 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
)
)
知道如何解决这个问题吗?我需要创建一个带有复选框的过滤器,它将显示产品的所有可用属性并允许用户搜索任何组合。
【问题讨论】:
-
发布问题后,我发现表格看起来不像预览中的样子。所以我试图手动制作它们。希望他们是可以理解的。
-
您需要与属性表进行第二次联接。您应该使用表名别名来防止两次使用相同的表名。抱歉,没有答案,因为我没有使用 Codeigniter 的经验。我猜你可以这样做:
->join('attributes AS A1',....和->join('attributes AS A2',....? -
对不起,我真的不明白第二次加入应该是什么。我可以请你举个例子吗?可以是原始的SQL查询,我会理解的
-
好的,我会在原始 SQL 中尝试答案。
-
有关索引 many:many 表的建议请参阅此内容:mysql.rjweb.org/doc.php/…
标签: php mysql database-design one-to-many entity-attribute-value