Фильтрация результатов Laravel в Eloquent

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: , , ,

Добавить комментарий