Php 来自3个表和where子句的Mysql查询

Php 来自3个表和where子句的Mysql查询,php,mysql,laravel,Php,Mysql,Laravel,我的数据库中有3个表 # Items id - name ---------- 1 - Item A 2 - Item B 3 - Item C 在Laravel中,我可以使用价值模型中的belongsTo[$this->belongsTo'App\traits','trait_id';]获取所有项目及其特征和值,以获得如下结果: --- Item A Color: red Grade: 90% Size: 4 inches --- Item B Color: g

我的数据库中有3个表

# Items
id - name 
----------
1  -  Item A 
2  -  Item B 
3  -  Item C 

在Laravel中,我可以使用价值模型中的belongsTo[$this->belongsTo'App\traits','trait_id';]获取所有项目及其特征和值,以获得如下结果:

--- Item A 
Color: red
Grade: 90%
Size: 4 inches

--- Item B 
Color: green
Grade: 45%
Size: 5 inches

.. etc 
从这样的代码:

$items = Items::get();
foreach ($items as $item) {
  echo '<h2>'.$item->name.'</h2>';
  foreach ($item->values as $value) {
      echo '<b>'.$value->trait->name . '</b>: ';
      echo $value->value . '<br>';
  }
}
然而,我不能做的是,我需要过滤这些结果,例如,我只需要它的颜色是红色,它的等级大于70%的项目


如果您不使用Larave,请随意在纯mysql查询中编写,我可能会找到一种在Laravel中实现的方法。。谢谢

通过多个属性值对过滤项目/实体是该方法的缺点之一。有一些方法可以做到这一点。一种是在每个条件下使用特征和值连接Items表:

选择i* 第i项 在v1.item_id=i.id上连接'Values`v1 在v2.item_id=i.id上连接'Values`v2 在t1.id=v1.trait\u id上连接Traits t1 在t2.id=v2.trait\u id上连接Traits t2 其中t1.name='Color'和v1.value='red' t2.name=‘Grade’和v2.value>70 您还可以使用数据透视来获得包含以下列的结果:项目id、颜色、等级:

选择v.item\u id ,当t.name='Color'然后v.value结束为Color时为maxcase ,当t.name='Grade'然后v.value结束为Grade时为maxcase 从`价值观` v 在t.id=v.trait\u id上连接Traits t 按v.item\u id分组 颜色=红色且等级>70 此结果可以与Items表联接以获取筛选的项。修改也可用于WHERE-in条件:

从项目中选择* 我在哪里 选择v.item\u id 从`价值观` v 在t.id=v.trait\u id上连接Traits t 按v.item\u id分组 当t.name='Color'然后v.value end='red'时使用maxcase 当t.name='Grade'然后v.value end>70时,则为maxcase ; 另一种方法:

从项目中选择* 我在哪里 选择v.item\u id 从`价值观` v 在t.id=v.trait\u id上连接Traits t 其中t.name='Color'和v.value='red' 或t.name=‘Grade’和v.value>70 按v.item\u id分组 有countv.item_id=2 ;
id在values表中没有任何作用,顺便说一句,这是一个糟糕的名称选择。如果使用EAV模型,一个很好的技巧是为每种数据类型构造单独的表。@事实上,这是我第一次了解EAV模型,上面的所有结构都来自我的头脑,对EAV一无所知,我将阅读更多关于它的内容,并了解这种方法的最佳实践,非常感谢tipThank Paul!当我第一次了解EAV模型时,我将阅读更多关于它的内容。
--- Item A 
Color: red
Grade: 90%
Size: 4 inches

--- Item B 
Color: green
Grade: 45%
Size: 5 inches

.. etc 
$items = Items::get();
foreach ($items as $item) {
  echo '<h2>'.$item->name.'</h2>';
  foreach ($item->values as $value) {
      echo '<b>'.$value->trait->name . '</b>: ';
      echo $value->value . '<br>';
  }
}