У меня есть сайт, на котором отображаются все сообщения, хранящиеся в базе данных, с панелью поиска вверху. Очевидно, что когда пользователь впервые посещает страницу, поисковый запрос не применяется, и все сообщения видны.

Когда пользователь затем ищет слово и нажимает кнопку поиска, все работает нормально. Однако, когда вы удаляете строку из панели поиска и снова нажимаете поиск, все сообщения исчезают, конечно, возврат с помощью кнопок мыши работает и перезагружается. Но я хотел бы добиться, чтобы при отправке пустой панели поиска появлялись все сообщения.

Это форма:

<form action=" {{ route('overview') }}" method="get">
    <div>
        <input placeholder="Schlagwort" type="text" id="s" name="s" value="{{ request()->get('s') }}">
    </div>
    <button type="submit">Suchen</button>
</form>

Это контроллер с функцией поиска:


public function index(Request $request) {

    $posts = Post::get();

    if($request->has('s')) {
        $query = strtolower($request->get('s'));
        $posts = $posts->filter(function ($post) use ($query) {
            if (Str::contains(strtolower($post->Titel), $query)) {
                return true;
            }
            return false;
        });

    } 
    return view('posts.overview', ['posts' => $posts]);
}

Я пробовал это, когда пытался добиться, чтобы "пустая панель поиска отображала все" функции "

public function index(Request $request) {
    $posts = Post::get();

    if($request->has('s')) {
        $query = strtolower($request->get('s'));
        $posts = $posts->filter(function ($post) use ($query) {
            if (Str::contains(strtolower($post->Titel), $query)) {
                return true;
            }
            return false;
        });

    } else if ($request == ' ') {
        return view('posts.overview', ['posts' => $posts]);
    }
    return view('posts.overview', ['posts' => $posts]);
}

Также заменен на else if ($request == null) ...

0
Frevelman 26 Ноя 2021 в 22:34
Привет @ miken32 :) Я хочу отображать все сообщения (точно так же, как когда пользователь впервые заходит на страницу), когда пользователь нажимает кнопку поиска с пустой панелью поиска
 – 
Frevelman
26 Ноя 2021 в 23:28
2
Попробуйте if($request->filled('s'))
 – 
miken32
26 Ноя 2021 в 23:32
Работает как шарм! Большое спасибо! Можете ли вы опубликовать его как ответ, чтобы я пометил его как правильный? Так что другие тоже могут это увидеть
 – 
Frevelman
26 Ноя 2021 в 23:37

1 ответ

Лучший ответ

Вы проверяете, присутствует ли вход s, тогда как вместо этого вы хотите проверить, есть ли у него значение. Используйте метод filled() для этого.

Кроме того, вы без нужды извлекаете все из базы данных, а затем фильтруете в PHP. Вместо этого создайте запрос, который проверяет входное значение, используя when() метод.

public function index(Request $request)
{    
    $posts = Post::query()
        ->when(
            $request->filled('s'),
            fn ($q) => $q->where('title', 'like', $request->s)
        )
        ->get();

    return view('posts.overview', ['posts' => $posts]);
}
1
miken32 26 Ноя 2021 в 23:45
Это отличный ответ! Спасибо, показывает мне совершенно другой способ его реализации. Я новичок в laravel, поэтому мой код должен выглядеть как резня для опытных людей: D
 – 
Frevelman
26 Ноя 2021 в 23:44
1
Надо где-нибудь начать. Я обновил ответ: сравнение строк не чувствительно к регистру, по крайней мере, в mysql
 – 
miken32
26 Ноя 2021 в 23:48
Да, я перевел все в нижний регистр, по крайней мере, я подумал, что это правильный способ сделать это.
 – 
Frevelman
26 Ноя 2021 в 23:52
1
В исходном коде, фильтрующем сбор всех сообщений, это было необходимо. Но при фильтрации в запросе к базе данных это не так.
 – 
miken32
26 Ноя 2021 в 23:54