Я хотел бы отфильтровать журналистов по категориям, о которых они пишут (например, «Спорт», «Муси» 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);
}