Простой поиск
Добавим маршрут в файл routes/web.php
и зададим имя для маршрута, чтобы с ними было удобно работать:
routes/web.php<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
Route::get('post/search',[PostController::class, 'search'])->name('post.search');
В layout шаблоне site.blade.php
(основной шаблон сайта) установим значение атрибута action
тега form
:
resources/views/layouts/site.blade.php<form class="form-inline my-2 my-lg-0" action="{{ route('post.search') }}">
<input class="form-control mr-sm-2" type="search" name="search"
placeholder="Найти пост..." aria-label="Поиск">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Поиск</button>
</form>
Добавим метод search()
в класс контроллера, который будет искать посты блога по введенной фразе:
app/Http/Controllers/PostController.php<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function search(Request $request) {
// данные поля формы name="search"
$search = $request->input('search');
// образаем слишком длинный запрос
$search = iconv_substr($search, 0, 64);
// удаляем все, кроме букв и цифр
$search = preg_replace('#[^0-9a-zA-ZА-Яа-яёЁ]#u', ' ', $search);
// сжимаем двойные пробелы
$search = preg_replace('#\s+#u', ' ', $search);
// проверка, если переменная $search пустая, подключаем пустой шаблон posts.search
if (empty($search)) {
return view('posts.search');
}
// если переменная $search не пустая, инициализируем поиск
$posts = Post::select('posts.*', 'users.name as author')
// Соединяем таблицы
->join('users', 'posts.author_id', '=', 'users.id')
// Поиск по заголовку поста
->where('posts.title', 'like', '%'.$search.'%')
// Поиск по тексту поста
->orWhere('posts.body', 'like', '%'.$search.'%')
// Поиск по автору поста
->orWhere('users.name', 'like', '%'.$search.'%')
// Сортировка
->orderBy('posts.created_at', 'desc')
// Включение пагинации
->paginate(4)
// Передаем в пагинацию для get запроса, строку поиска
->appends(['search' => $request->input('search')]);
return view('posts.search', compact('posts'));
}
}
Осталось создать шаблон search.blade.php
в директории resources/views/posts
который будет выводить найденные посты и подключаться к основному шаблону:
resources/views/posts/search.blade.php@extends('layouts.site')
@section('content')
<h1 class="mt-2 mb-3">Результаты поиска</h1>
@if (isset($posts) && count($posts))
<div class="row">
@foreach ($posts as $post)
<div class="col-6 mb-4">
<div class="card">
<div class="card-header"><h3>{{ $post->title }}</h3></div>
<div class="card-body">
<img src="{{ $posts->image ?? asset('img/default.jpg') }}" alt="" class="img-fluid">
<p class="mt-3 mb-0">{{ $post->excerpt }}</p>
</div>
<div class="card-footer">
<div class="clearfix">
<span class="float-left">
Автор: {{ $post->author }}
<br>
Дата: {{ date_format($post->created_at, 'd.m.Y H:i') }}
</span>
<a href="#" class="btn btn-dark float-right">Читать дальше</a>
</div>
</div>
</div>
</div>
@endforeach
</div>
{{ $posts->links() }}
@else
<p>По вашему запросу ничего не найдено</p>
@endif
@endsection