Запрос данных в базе 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