Запрос данных в базе Laravel с помощью Eloquent

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

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