Каждое из них создало код для фильтрации поисковых запросов по полу, национальности, цели и возрасту, но все эти приложения работают отдельно. Я хочу сделать это результатом. Я хотел бы знать, как реагировать на различные условия одновременно. Например, если пол и возраст слышны сразу, я должен вернуть результаты по нему, и я хочу знать, как это сделать. Здесь я хочу решить две вещи. 1.Применить наложение условия ко всем результатам поиска 2.При входе на страницу без поиска не печатался список
//base Object
$penpals = $this->penpalModel->getUsers();
//name search
if (!empty($request->name)) {
$users = $this->userModel->where('name', 'like', '%' . $request->name . '%')->get();
if (!empty($users)) {
$penpals->whereIn('user_id', $users);
}
}
//gender search
if (!empty($request->gender) && $request->gender !== 'all') {
$penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.gender')
->where('users.gender', $request->gender);
}
// country search
if (!empty($request->country) && $request->country !== 'all') {
$penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.country')
->where('users.country', $request->country);
}
// goal search
if (!empty($request->goal) && $request->goal !== 'all') {
$penpals = $this->penpalModel->where('goal_id',$request->goal)->latest();
}
//age search
if ($request->ageMin != 1 || $request->ageMax != 100 ){
$ageMin = floor($request->ageMin);
$ageMax = floor($request->ageMax);
$penpals = $this->penpalModel->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.age')
->whereBetween('users.age', [$ageMin, $ageMax])
->orderBy('penpals.created_at','desc');
}
//search result
$penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12);
$penpalsCount = count($penpalsData);
return view('penpal.index')->with([
'penpals' => $penpalsData,
'penpalsCount' => $penpalsCount
]);
Что бы я сделал, так это построил бы объект по мере того, как вы проходите через поисковые фильтры.
Что вы делаете в настоящее время, так это применяете фильтр и резко завершаете его для каждого.
Сначала примените каждый имеющийся фильтр, а в конце выполните поиск.
Делай так:
add filter (age).
add filter (nationality).
-> then finally execute search.
Нет:
filter (age) -> search. execute.
filter (nationality) -> search. execute.
Вот идея (конечно, это не проверено):
<?php
// $penpals = $this->penpalModel->getUsers()->latest()->paginate(12);
// base penpals object
$penpals = $this->penpalModel;
// start out with the initial original object, untouched
// if nickname is present, add filter nickname
if (!empty($request->name)) {
$users = $this->userModel->where('name', 'like', '%' . $request->name . '%')->get();
if (!empty($users)) {
// apply | attached user ids found
$penpals->whereIn('user_id', $users);
}
}
// dont cut off the query and execute yet, continually check other filters
if (!empty($request->gender) && $request->gender !== 'all') {
$penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.gender')
->where('users.gender', $request->gender);
}
// again, continue to the next set of filters (country search)
// and so on, the same syntax, build off of the base object and continually connect filters
// then on the end, EXECUTE it!
$penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12); // execute then builder after several layers of filters are applied!
$penpalsCount = count($penpalsData);
return view('penpal.index')->with([
'penpals' => $penpalsData,
'penpalsCount' => $penpalsCount
]);
Просто следуйте этой идее или концепции, это не ваша копия ответа и тип работы. Измените его и подгоните под свою бизнес-логику.
Я решил это с помощью функции whereHas(). Спасибо за совет
@박보근 хорошо, я понимаю, кстати, пожалуйста, удалите комментарий выше с данными образца электронной почты. если это исходит от данных ваших клиентов, то это конфиденциально
Не волнуйтесь, это просто фиктивные данные. Я студент и это мое хобби. Спасибо.
@박보근привет, удалите письмо выше, его конфиденциальные данные, ошибка не уникальна, означает, что вы получаете то же имя, используйте псевдоним
users a u
иpenpals as p
, чтобы избежать этого