Запрос данных в базе Laravel с помощью Eloquent
Development | Комментировать запись
Eloquent – это объектно-реляционный преобразователь (ORM), который включен в структуру Laravel по умолчанию. В этой серии статей вы узнаете, как делать запросы к базе данных и как работать с отношениями в Laravel Eloquent. Также вы сможете попрактиковаться на примерах: мы попробуем улучшить демо-приложение с помощью новых моделей и отношений.
Примечание: Все мануалы данной серии можно найти по тегу Laravel Eloquent.
Если вы выполняли эту серию мануалов последовательно, на данный момент у вас уже есть обновить база данных и команды приложения, которые включают списки ссылок.
Основной маршрут приложения в настоящее время показывает все ссылки в БД без информации о списках. В этом руководстве мы обновим основное представление интерфейса, чтобы отразить новую архитектуру приложения.
Одним из самых больших преимуществ использования ORM-системы является возможность управлять строками в таблице БД как объектами в кодовой базе. Eloquent предоставляет несколько методов, к которым можно получить доступ непосредственно из моделей, чтобы запросить БД и отфильтровать результаты без необходимости писать операторы SQL. К примеру, обычный запрос SELECT для извлечения всех строк из таблицы (который в чистом SQL выглядит так: SELECT * FROM links) в Eloquent может быть выполнен с помощью такого кода:
$links = Link::all();
Набор результатов возвращается как коллекция Eloquent, повторяемый объект, который ведет себя аналогично массиву, но предоставляет расширенные функциональные возможности, такие как методы сопоставления/сокращения и извлечение свежих данных из объектов при необходимости, что помогает повысить общую производительность при взаимодействии с базой данных.
Обновление маршрута
Если вы изучите главный файл маршрута приложения, в котором определен основной маршрут, вы заметите, что текущий код приложения запрашивает все ссылки с помощью вызова Link::all(). Откройте файл routes/web.php в редакторе кода:
routes/web.php
Маршрут / в данный момент имеет такой вид:
… Route::get('/', function () { $links = Link::all()->sortDesc(); return view('index', [ 'links' => $links ]); }); …
Как следует из самого названия, метод sortDesc() используется для упорядочивания результатов в порядке убывания, от последнего к первому. Этот метод не аналогичен оператору ORDER BY в запросе SQL, поскольку метод sortDesc работает на уровне кода, переупорядочивая коллекцию. Пока что вы можете игнорировать этот метод: подробнее мы поговорим о порядке результатов в следующем разделе этой серии.
Теперь давайте отредактируем этот код, чтобы получить коллекцию всех списков, зарегистрированных в настоящее время в БД, чтобы иметь возможность использовать его позже во внешнем интерфейсе для отображения всех названий списков.
Во-первых, в начало файла мы включим объявление use, ссылаясь на модель LinkList. Это объявление позволит нам не вводить полное имя класса каждый раз, когда мы ссылаемся на этот класс.
<?php use Illuminate\Support\Facades\Route; use App\Models\Link; use App\Models\LinkList; ...
Затем измените определение return основного маршрута, включив в него переменную lists, содержащую все зарегистрированные списки:
… return view('index', [ 'links' => $links, 'lists' => LinkList::all() ]); …
Вот так должен выглядеть готовый файл. Обратите внимание на выделенные изменения:
<?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() ]); });
Не забудьте сохранить файл.
Обновление представления
Как только мы обновим основной маршрут, мы можем отредактировать связанный с ним файл представления, чтобы предоставить необходимую информацию о списках. Откройте файл resources/views/index.blade.php в редакторе кода:
resources/views/index.blade.php
Этот файл содержит единственное представление, которое приложение использует на своей главной странице. Найдите в этом файле блок @foreach, который перебирает переменную $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> </div> @endforeach ...
Код в цикле пока что не содержит никакой информации о списках. Теперь после ссылки мы добавим новую строку, содержащую заголовок списка, в котором эта ссылка сохранена. Здесь можно использовать CSS-класс tag из Bulma, чтобы оформить эту информацию как тег:
… <p>{{$link->url}}</p> <p class="mt-2"><a href="#" title="{{ $list->title }}" class="tag is-info">{{ $link->link_list->title }}</a></p>
Добавьте выделенную строку в свой файл. Ссылки мы изменим позже, когда будут настроены отдельные страницы списков (об этом – в следующей части этой серии).
Затем найдите абзац с классом subtitle, который идет сразу после тега <h1> и перед разделом, содержащим ссылки. Здесь мы заменим общий текст, используемый в этой области, на меню, составленное на основе наших списков ссылок (их мы сделали доступными ранее в переменной lists, когда редактировали стандартный маршрут routes/web.php).
Замените код в разделе subtitle выделенными строками:
<p class="subtitle"> @foreach ($lists as $list)<a href="#" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }}</a> @endforeach </p>
Стили тегов списка немного отличаются от прежних (в них есть дополнительный CSS-класс is-light для инвертирования цветов каждого тега).
Вот как должен выглядеть файл 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"> Check out my awesome links </h1> <p class="subtitle"> @foreach ($lists as $list)<a href="#" 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="#" title="{{ $list->title }}" class="tag is-info">{{ $link->link_list->title }}</a></p> </div> @endforeach </section> </div> </section> </body> </html>
Затем сохраните файл. Главное представление приложения теперь готово к отображению обновленной информации о списках ссылок.
При желании сейчас вы можете использовать Artisan-команду link:new, чтобы добавить новые ссылки и протестировать обновленное приложение:
docker-compose exec app php artisan link:new
Вы получите такой вывод:
Link URL: > https://laravel.com/docs/8.x/ Link Description: > Laravel Docs Link List (leave blank to use default): > laravel New Link: https://laravel.com/docs/8.x/ - Laravel Docs Listed in: laravel Is this information correct? (yes/no) [no]: > yes Saved.
Затем перезагрузите страницу приложения в своем браузере. Если вы используете Docker Compose, приложение должно быть доступно по следующему локальному адресу:
http://localhost:8000
Вы получите страницу Check out my awesome links, на которой будут размещены 4 ссылки.
В следующей части этой серии мануалов мы настроим отдельные страницы для каждого списка. Также вы узнаете, как делать запросы к базе данных с помощью метода where() для получения более подробных результатов.
Tags: Eloquent, Laravel, Laravel Eloquent, ORM