Laravel什么都没有或没什么

时间:2018-06-10 23:27:57

标签: database laravel eloquent

我正在制作一个系统来过滤用户的需求,而且我必须按所选的所有属性进行过滤,这里是我的查询构建器:

    return EncyclopedieModel::with('stats')
        ->join('equipement_stats', 'equipement_stats.id_equipement', '=', 'equipement.id_equipement')
        ->join('stats', 'stats.id_stats','=','equipement_stats.id_stats')
        ->whereIn('stats.id_stats', $filterStats)
        ->whereIn('id_typeequipement', $filterEquipement)
        ->whereIn('id_rarete', $filterRarity)
        ->skip(0 + $toskip)
        ->take(10)
        ->get()
        ->toJson();

我必须过滤统计数据的多个要求。

我首先采用符合用户需求的所有设备,然后通过急切加载获得项目的统计信息。

我的问题是我必须同时获得具有两种统计数据的项目。例如,如果我的项目具有统计数据" 3"和" 7"我必须得到所有包含这些统计数据的项目。

现在,我已经获得了统计数据" 3"以及所有与统计数据相关的设备" 7" ...

我不知道应该如何实现它

编辑:我尝试用汽车和特性进行简化

    [
  {
    "id_car":1,
    "nom_car":"Car A",
    "rarity": 1,
    "caracteristic":[
      {
        "id_caracterstic":3,
        "nom_stats":"Caracteristic A"
      },
      {
        "id_caracterstic":8,
        "nom_stats":"Caracteristic W"
      },
      {
        "id_caracterstic":4,
        "nom_stats":"Caracteristic Z"
      }
    ]
  },
  {
    "id_car":2,
    "nom_car":"Car B",
    "rarity": 2,
    "caracteristic":[
      {
        "id_caracterstic":5,
        "nom_stats":"Caracteristic P"
      },
      {
        "id_caracterstic":8,
        "nom_stats":"Caracteristic W"
      },
      {
        "id_caracterstic":12,
        "nom_stats":"Caracteristic ZA"
      }
    ]
  },
  {
    "id_car":1,
    "nom_car":"Car C",
    "rarity": 2,
    "caracteristic":[
      {
        "id_caracterstic":12,
        "nom_stats":"Caracteristic P"
      },
      {
        "id_caracterstic":8,
        "nom_stats":"Caracteristic W"
      },
      {
        "id_caracterstic":14,
        "nom_stats":"Caracteristic ZDD"
      }
    ]
  },
    ]

就像我必须在我的数据库中找到汽车一样稀有," 2"和特点是8和12。

我现在正在做的方式,我获得了A车,B车和C车,因为我的查询通过所有具有特征8的车辆和所有具有特征12的车辆

我想要的只是当我正在寻找一辆具有特色的汽车时才能获得汽车B和汽车C." 8"和" 12"

1 个答案:

答案 0 :(得分:1)

根据您的问题,我的理解是您希望过滤模型以仅包含具有所有必需设备类型的模型。

考虑到这一点,您只需修改现有查询即可使用HAVINGGROUP BY

return EncyclopedieModel::with('stats')
    ->join('equipement_stats', 'equipement_stats.id_equipement', '=', 'equipement.id_equipement')
    ->join('stats', 'stats.id_stats','=','equipement_stats.id_stats')
    ->whereIn('stats.id_stats', $filterStats)
    ->whereIn('id_typeequipement', $filterEquipement)
    ->whereIn('id_rarete', $filterRarity)
    ->groupBy('enclopedie.id_car')
    ->havingRaw('COUNT(id_typeequipement) = ?', [count($filterEquipement)])
    ->skip(0 + $toskip)
    ->take(10)
    ->get()
    ->toJson();

GROUP BY需要对每个不同模型的设备类型进行分组,以便稍后进行比较。 HAVING本质上是应用于聚合函数的WHERE子句。在这种情况下,COUNT

因此,我们希望找到与指定设备类型数完全匹配的所有模型。

修改 - 定义

  

SQL中的HAVING子句指定SQL SELECT语句应仅返回聚合值满足指定条件的行。它被添加到SQL语言中,因为WHERE关键字不能与聚合函数一起使用。