Полный цикл в digital

Простой поиск

Добавим маршрут в файл 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
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг