Laravel / MySQL / Eloquent: сгруппированные предложения - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть функция поиска на моем веб-сайте, благодаря которой пользователь может выполнять поиск по различным свойствам автомобилей в определенных диапазонах.Пользователь может или не может выбрать поиск по определенному свойству.Эти массивы являются просто динамическими и могут иметь 0, 1, 2 или 3 записи, в зависимости от того, какое использование выбрано (поэтому запрос должен быть динамическим), то есть:

$price_ranges = [
  [0, 1000],
  [1000, 2000],
  [2000, 3000]
];

$weight_ranges = [
  [1000, 2000],
  [5000, 9999]
]

Я хочу использовать построитель запросов вLaravel / Eloquent для создания соответствующего запроса для этого, но у меня много трудностей при группировке предложений.Вот что у меня есть:

$query = Shipment::with(['cars']);

foreach($price_ranges as $price_range){
  $query->whereHas('cars', function($q) use(&$price_range){
    $q->where('price', '>=', $range[0])->where('price', '<=', $range[1]);
  });
}

foreach($weight_ranges as $weight_range){
  $query->whereHas('cars', function($q) use(&$weight_range){
    $q->where('weight', '>=', $range[0])->where('weight', '<=', $range[1]);
  });
}

$results = $query->get();

Проблема с этим кодом состоит в том, что он находит грузы, у которых есть машины, которые удовлетворяют каждому ценовым условиям ... но я хочу, чтобы он нашелотправления, если он удовлетворяет любым условиям и возвращает только соответствующие автомобили.Я создал схему, чтобы лучше проиллюстрировать, что я пытаюсь сделать:

enter image description here

1 Ответ

0 голосов
/ 17 сентября 2018

Я думаю, что вам просто нужно, чтобы пользователь или где вместо этого или где есть!но вам нужно обернуть весь весовой запрос одним, где

$query = Shipment::with(['cars']);

foreach($price_ranges as $price_range){
  $query->orWhereHas('cars', function($q) use(&$price_range){
    $q->where('price', '>=', $range[0])->where('price', '<=', $range[1]);
  });
}

foreach($weight_ranges as $weight_range){
  $query->where(function($q) use(..) {
    $q->orWhereHas('cars', function($q) use(&$weight_range){
        $q->where('weight', '>=', $range[0])->where('weight', '<=', $range[1]);
    });
  });
}

$results = $query->get();

Я могу быть совершенно неправ, не делал это долгое время.Пожалуйста, дайте мне знать и удачи.

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