Фильтрация результатов 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