Laravel whereIn (), действующий как orWhereIn () - PullRequest
0 голосов
/ 04 июля 2018

Есть 3 таблицы:

  1. питание
  2. метка
  3. meal_tag

Я хочу получать все блюда, содержащие все теги, из URL-запроса.

Например: .../api/query?tags=1,2,3

В этом примере я хочу получить все блюда, которые имеют

tag1 И tag2 И tag3

, но мой запрос возвращает блюда с

tag1 ИЛИ tag2 ИЛИ tag3

Вот мой запрос:

   $query = Meal::query();  
   ...

   if ($request->has('tags')) {

        $inputTags = $request->query('tags');

        $tags = explode(',', $inputTags);


        $query = $query->whereHas('tags', function($q) use ($tags) {
            $q->whereIn('tags.id', $tags);
        });
    }

1 Ответ

0 голосов
/ 04 июля 2018

IN() проверяет, находится ли значение в наборе значений, для любого сопоставленного значения затем возвращается значение true, не проверяется наличие всех значений,

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

if ($request->has('tags')) {
    $inputTags = $request->query('tags');
    $tags = explode(',', $inputTags);
    foreach($tags as $tag){
        $query = $query->whereHas('tags', function($q) use ($tag) {
            $q->where('id','=', $tag);
        });
    }
}
...