Содержание
скрыть
Индекс для поля title
Создадим миграцию:
php artisan make:migration alter_table_post_add_title_index --table=posts
Изменим созданный файл:
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->index('title');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropIndex('title');
});
}
И выполним миграцию:
php artisan migrate
Контроллер
Создадим рут:
Route::get('/search', 'SearchController@index')->name('search');
Создадим контроллер:
php artisan make:controller SearchController
Вынесем навбар в отдельный файл resources/views/layouts/navbar.blade.php и подключим его в файлах resources/views/layouts/layout.blade.php , resources/views/layouts/category_layout.blade.php .
@include('layouts.navbar')
В контроллер запишем:
class SearchController extends Controller
{
public function index(Request $request)
{
$request->validate([
's' => 'required',
]);
$s = $request->s;
$posts = Post::where('title', 'LIKE', "%{$s}%")->with('category')->paginate(2);
return view('posts.search', compact('posts', 's'));
}
}
Scope
Добавим в app/Models/Post.php скоуп:
public function scopeLike($query, $s) {
return $query->where('title', 'LIKE', "%{$s}%");
}
И вызовем его в app/Http/Controllers/SearchController.php :
$posts = Post::like($s)->with('category')->paginate(2);
like($s) — это наш scope.
Вью
Создадим страницу resources/views/posts/search.blade.php, в которую скопируем все из resources/views/posts/index.blade.php . И адаптируем ее.