2015-09-11 5 views
0

У меня проблема, которую я не знаю, как ее решить. У меня есть компании, у которых есть профиль (профиль принадлежит компании), и у него есть места (у компании много мест).Laravel 5.1 - Запрос нескольких отношений

Я пытаюсь получить все компании, которые имеют имя, как $request->input('search_term') и имеют наименьшую одно место с застежкой-молнией или города, соответствующего $request->input('search_addition') и профиль с типом 0.

Мой код:

$companies = Company::with(['profile' => function ($query) { 
        $query->where('type', 0); 

       }]) 
       ->whereHas('locations', function ($query) use ($request) { 
        $query->where('zip', 'like', '%'.$request->input('search_addition').'%') 
          ->orWhere('city', 'like', '%'.$request->input('search_addition').'%'); 
       }) 
       ->where('name', 'like', '%'.$request->input('search_term').'%'); 

в конце добавить $companies = $companies->paginate(25);

в результате я получаю не то, что я хочу. Я получаю все компании, у которых есть такое имя, как $request->input('search_term'). Он игнорирует тип профиля и местоположения. Массив местоположений пуст для тех компаний, которые не соответствуют указанному запросу search_addition, но он по-прежнему возвращает компанию.

ответ

0

with() используется для связи с загрузкой либо с ограничением, либо без ограничений, а не как ограничение для фильтрации родительской модели, которая должна использоваться вместо семейства функций where.

Это то, что я думаю, что код должен быть (не проверен).

$companies = Company::with('profile') 
    ->with(['locations' => function ($query) use ($request) { 
     $query->where('zip', 'like', '%'.$request->input('search_addition').'%') 
      ->orWhere('city', 'like', '%'.$request->input('search_addition').'%'); 
    }]) 
    ->whereHas('profile', function ($query) { 
     $query->where('type', 0); 
    }) 
    ->whereHas('locations', function ($query) use ($request) { 
     $query->where('zip', 'like', '%'.$request->input('search_addition').'%') 
      ->orWhere('city', 'like', '%'.$request->input('search_addition').'%'); 
    }) 
    ->where('name', 'like', '%'.$request->input('search_term').'%'); 
+0

Это не работает, к сожалению. Вернемся к чертежной доске. Однако ваш намек на «с» был хорош. Возможно, я смогу решить проблему таким образом. –

Смежные вопросы