Laravel, где все или ничего - PullRequest
0 голосов
/ 11 июня 2018

Я создаю систему для фильтрации требований пользователя, и для одной части я должен фильтровать по всем выбранным атрибутам, вот мой конструктор запросов:

    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, Car B и Car C, потому что мой запрос просматривает все автомобили с характеристикой 8 и все автомобили с характеристикой 12

Я хочу, чтобы автомобили B и Car C получали только тогда, когда я ищуавтомобиль с характеристиками "8" и "12"

1 Ответ

0 голосов
/ 11 июня 2018

Исходя из вашего вопроса, я понимаю, что вы хотите отфильтровать ваши модели, чтобы включить в них только те, которые имеют все необходимые типы оборудования.

Имея это в виду, вам просто нужно изменить существующий запрос наиспользуйте HAVING и GROUP 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.

Итак, мы хотим найти все модели, которые точно соответствуют числу указанных типов оборудования.

Редактировать - определение HAVING

A HAVINGПредложение в SQL указывает, что оператор SQL SELECT должен возвращать только те строки, в которых агрегатные значения удовлетворяют указанным условиям.Он был добавлен в язык SQL, поскольку ключевое слово WHERE нельзя использовать с агрегатными функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...