Фильтрация результатов Laravel в Eloquent
Development | Комментировать запись
Eloquent – это объектно-реляционный преобразователь (ORM), который включен в структуру Laravel по умолчанию. В этой серии статей вы узнаете, как делать запросы к базе данных и как работать с отношениями в Laravel Eloquent. Также вы сможете попрактиковаться на примерах: мы попробуем улучшить демо-приложение с помощью новых моделей и отношений.
Примечание: Все мануалы данной серии можно найти по тегу Laravel Eloquent.
В предыдущей части этой серии мануалов мы обновили наше демо-приложение и упорядочили ссылки в списки в БД. Теперь в главном представлении приложения отображается меню со всеми списками, которые в настоящее время зарегистрированы в базе данных, но пока что в меню нет активных ссылок.
В этом разделе мы создадим в приложении новый маршрут, чтобы отображать ссылки по списку. Вы также узнаете, как использовать метод where() в Eloquent для лучшей фильтрации результатов в запросе к базе данных.
Для начала откройте файл routes/web.php в редакторе кода:
routes/web.php
В настоящее время файл имеет следующий вид:
<?php use Illuminate\Support\Facades\Route; use App\Models\Link; use App\Models\LinkList; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { $links = Link::all()->sortDesc(); return view('index', [ 'links' => $links, 'lists' => LinkList::all() ]); });
Вызов Route::get определяет маршрут HTTP GET для страницы входа в приложение. Когда к приложению поступает запрос /, эта функция обратного вызова запускается и возвращает стандартное представления.
Теперь мы создадим второй маршрут для отображения списков ссылок на основе слага (slug). Слаг – это короткая строка, которая обычно используется для создания удобных URL-адресов. Новый маршрут должен запрашивать в таблице link_lists список, который содержит параметр URL в качестве поля slug. Если список с этим ярлыком не может быть найден, приложение должно сообщить пользователю об ошибке HTTP 404 not found.
Следующий код создает маршрут GET с использованием динамического параметра ({slug}) по имени link-list. Этот параметр будет делать следующее:
- Использовать модель LinkList для запроса базы данных с помощью метода where(), используя слаг в качестве критерия поиска. Метод first() гарантирует, что в результате поиска будет возвращен только один объект.
- Если список с указанным слагом не может быть найден, с помощью метода abort выдается ошибка 404.
- Если список найден, приложение отображает стандартное представление, и список используется в качестве параметра шаблона.
Параметр $lists предоставляется для сборки меню списка, а параметр $links – для совместимости с текущей версией представления (поскольку он просматривает переменную с этим именем).
Включите следующий код в конец файла routes/web.php:
Route::get('/{slug}', function ($slug) { $list = LinkList::where('slug', $slug)->first(); if (!$list) { abort(404); } return view('index', [ 'list' => $list, 'links' => $list->links, 'lists' => LinkList::all() ]); })->name('link-list');
По завершении сохраните файл.
Примечание: Хотя для реализации маршрутов существуют сокращения, которые ссылаются на модели Eloquent, здесь в учебных целях мы сосредоточимся на использовании метода where().
Чтобы проверить, работает ли ваш новый маршрут, вы можете зайти в браузер и перейти по ссылке на стандартную страницу со списком. Если вы выполнили все шаги этой серии мануалов, страница списка должна быть доступна по следующему локальному адресу:
http://localhost:8000/default
Вы увидите ту же страницу, что и раньше, но теперь на ней отображаются только ссылки из списка default. Если у вас есть другие списки, вы можете получить доступ к их страницам, заменив выделенный слаг по умолчанию в URL-адресе на слаг нужного вам списка.
Настроив новый маршрут, вы можете использовать метод route для динамической генерации URL-адресов ваших списков из стандартного представления. Вы также можете настроить заголовок страницы, чтобы отображать информацию о списке, если он доступен.
Откройте файл resources/views/index.blade.php в редакторе кода:
resources/views/index.blade.php
В этом файле есть 2 строки, которые необходимо обновить. Сначала найдите абзац subtitle, содержащий меню, которое вы создали в предыдущем мануале этой серии. Вот как он выглядит сейчас:
<p class="subtitle"> @foreach ($lists as $list)<a href="#" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }}</a> @endforeach </p>
Обновите гиперссылку href, включив в нее текущий URL-адрес страницы списка, используя метод route. Этот метод принимает имя маршрута первым аргументом, а параметры URL-адреса – в качестве дополнительных аргументов для вызова. Замените символ # следующим выделенным кодом:
<p class="subtitle"> @foreach ($lists as $list)<a href="{{ route('link-list', $list->slug) }}" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }}</a> @endforeach </p>
Затем найдите раздел links и цикл foreach. Здесь вам нужно включить еще один вызов метода route(), в котором для каждой ссылки будет выводиться имя списка. Это похоже на предыдущий пример, однако доступ к объекту списка будет другим (через переменную $link):
<p>{{$link->url}}</p> <p class="mt-2"><a href="{{ route('link-list', $link->link_list->slug) }}" title="{{ $link->link_list->title }}" class="tag is-info">{{ $link->link_list->title }}</a></p>
Затем вы можете включить информацию о списке. Здесь можно проверить наличие переменной $list и вывести заголовок списка, только если эта переменная доступна.
Замените раздел title следующим выделенным кодом:
<h1 class="title"> @if (isset($list)) {{ $list->title }} @else Check out my awesome links @endif </h1>
Вот так будет выглядеть файл index.blade.php, когда вы закончите (для вашего удобства все внесенные изменения выделены красным):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>My Awesome Links</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css"> <style> html { background: url("https://i.imgur.com/BWIdYTM.jpeg") no-repeat center center fixed; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; } div.link h3 { font-size: large; } div.link p { font-size: small; color: #718096; } </style> </head> <body> <section class="section"> <div class="container"> <h1 class="title"> @if (isset($list)) {{ $list->title }} @else Check out my awesome links @endif </h1> <p class="subtitle"> @foreach ($lists as $list)<a href="{{ route('link-list', $list->slug) }}" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }}</a> @endforeach </p> <section class="links"> @foreach ($links as $link) <div class="box link"> <h3><a href="{{ $link->url }}" target="_blank" title="Visit Link: {{ $link->url }}">{{ $link->description }}</a></h3> <p>{{$link->url}}</p> <p class="mt-2"><a href="{{ route('link-list', $link->link_list->slug) }}" title="{{ $link->link_list->title }}" class="tag is-info">{{ $link->link_list->title }}</a></p> </div> @endforeach </section> </div> </section> </body> </html>
Сохраните файл, когда внесете все необходимые изменения.
Теперь вы можете получить доступ к главной странице приложения через браузер. Если вы используете установку Docker Compose, приложение должно быть доступно по следующему локальному адресу:
http://localhost:8000
В следующем мануале этой серии вы узнаете, как упорядочить результаты запросов в Laravel Eloquent.
Tags: Eloquent, Laravel, Laravel Eloquent, ORM