【发布时间】:2021-08-08 20:00:03
【问题描述】:
我有两张桌子Products 和Product_Data。我想将product 数据与products 分开存储,因为products 可以具有动态properties,因此我不想将所有products 数据放在Products 表中。
产品表
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | NULL | ||
| description | text | NO | NULL | ||
| price_currency | varchar(255) | NO | NULL | ||
| price_amount | varchar(255) | NO | NULL | ||
| created_at | timestamp | YES | NULL | ||
| updated_at | timestamp | YES | NULL |
产品数据表
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| product_id | bigint unsigned | NO | NULL | ||
| attribute | varchar(255) | NO | NULL | ||
| value | varchar(255) | NO | NULL | ||
| created_at | timestamp | YES | NULL | ||
| updated_at | timestamp | YES | NULL |
我想获取所有具有两个值的products:Black 和Man。我尝试运行以下查询,但它返回所有 products with the attribute BlackandMan`。
SELECT product_id FROM product_data WHERE value IN ("black", "man");
我正在使用laravel 和eloquent。上述行为,也反映了我运行以下代码时的结果:
$products = Product::whereHas('properties', function ($query) use ($searchValues) {
$query->whereIn('value', $searchValues);
})
->paginate(25);
上面的代码返回所有具有black 或man 的products。
解决此问题的最佳方法是什么?
【问题讨论】:
-
为什么你的
price_amount是varchar(255)?一些数字类型会更合适...或者您是否希望接受像'banana'这样的值作为价格? -
@stickybit 这不是一个生产就绪的应用程序。在重构之前我正在研究细节。此外,我使用的外部 api 有时是不可靠的,数据会发生变化,有时数据确实是“香蕉”。我宁愿让它在这个阶段收集错误的数据,然后由于类型问题根本不收集数据。另外,我看不出这条评论有什么帮助..
-
“我看不出这条评论有什么帮助”——如果你还没有意识到错误类型的使用,它会有所帮助。它与查询无关。为了清楚起见,我应该将其标记为旁注。这些在 cmets 中是可以接受的。
-
问题是由于您的动态属性,您在查询中增加了另一层复杂性。我假设您可以执行一些计数操作并仅返回黑色计数 > 0 和人计数 > 0 的产品。但您可能需要一些 Raw 操作。
标签: laravel eloquent php mysql laravel eloquent