Фильтровать результаты поиска по текстовому вводу и категориям в Laravel - PullRequest
0 голосов
/ 18 марта 2020

Я хотел бы отфильтровать журналистов по категориям, о которых они пишут (например, «Спорт», «Муси» c), или выполнить поиск, например, по имени журналиста и их комбинации. Когда пользователь выполняет поиск по указанному c имени и уже выбрал некоторые категории, результаты основываются только на результатах поиска, а не на категориях. Выбор категорий уже в порядке с помощью этот пост .

Ниже моего кода:

$categoriesIds  = session()->get('categories');
$search         = session()->get('search');
 if(empty($categoriesIds) and empty($search)) {
    $journalists    = Journalist::where('active', 1)->paginate(100);
 } else if (empty($categoriesIds) and !empty($search)) {
    $journalists = Journalist::where('active', 1)
                   ->join('journalist_sources', 'journalists.source_id', '=', 'journalist_sources.id')
                ->where(function($q) use ($search) {
                    $q->where('name', 'LIKE', '%' . $search . '%')
                    // ->orWhere('phone', 'LIKE', '%' . $search . '%')
                    ->orWhere('title', 'LIKE', '%' . $search . '%') // for source_id
                    ->orWhere('city', 'LIKE', '%' . $search . '%');
                })
               ->paginate(100);
  } else if (!empty($categoriesIds) and empty($search)) { 
     $journalists    = Journalist::where('active', 1) 
                    // ->join('journalist_sources', 'journalists.source_id', '=', 'journalist_sources.id')                           
                      ->whereHas('categories', function($q) use ($categoriesIds) {
                    $q->select('journalist_id', \DB::raw('count(journalist_id) as jcount'));
                    $q->whereIn('journalist_category_id', $categoriesIds);
                    $q->groupBy('journalist_id');
                    $q->having('jcount', count($categoriesIds));
                })
                 ->paginate(100);                           
  } else {
      $journalists    = Journalist::where('active', 1) 
                       ->join('journalist_sources', 'journalists.source_id', '=', 'journalist_sources.id')                           
                       ->where(function($q) use ($search) {
                         $q->where('name', 'LIKE', '%' . $search . '%')
                         // ->orWhere('phone', 'LIKE', '%' . $search . '%')
                    ->orWhere('title', 'LIKE', '%' . $search . '%') // for source_id
                    ->orWhere('city', 'LIKE', '%' . $search . '%');
                })
                ->whereHas('categories', function($q_cat) use ($categoriesIds) {
                    $q_cat->select('journalist_id', \DB::raw('count(journalist_id) as jcount'));
                    $q_cat->whereIn('journalist_category_id', $categoriesIds);
                    $q_cat->groupBy('journalist_id');
                    $q_cat->having('jcount', count($categoriesIds));
                })->paginate(100);
        }
...