/ laravel

Что такое связи в Laravel? Что такое связи в Mysql? В чем отличия

Тема связей в Laravel беспокоит многих новичков. Ввиду популярности этой темы, и её обязательного понимания, было принято решение о написании подробной статьи. Eloquent связи в фреймворке определяются как обычные методы, позволяющие объединять разного рода сущности.
Фреймворк предоставляет большой выбор типов связей. Так что, начнём с основ: что такое laravel связи, примеры связанных таблиц, отличие связей фреймворка, и mysql связей базы данных.

Немного абстракции.

Очень часто одна таблица ссылается на другую. Например, таблица posts имеет поле user_id, которое указывает на id пользователя системы.

На нативном псевдо-PHP, это выглядело бы примерно так

//получаем пост
$post = DB::query("SELECT * FROM `posts` WHERE `id` = :id LIMIT 1", ['id' => ...]);
//получаем автора поста
$author = DB::query("SELECT * FROM `users` WHERE `id` = :id LIMIT 1", ['id' => $post->user_id]);    

Здесь выполняется чистый SQL код. Однако, в Laravel фреймворке все запросы к базе данных производятся через Eloquent модели, потому, на манер фреймворка, вышеописанный синтаксис будет выглядеть примерно так:
//получаем пост
$post = Post::find(...)->first();
//получаем автора поста
$author = User::find($post->user_id)->first();   

Но, этот код, по сути, ничем не отличается от написанного в самом начале. Разница только в том, что над запросами используется обёртка в виде Eloquent ORM. Потому, было бы непростительно иметь в арсенале связи, и их не использовать. И вот, как это будет выглядеть по-новому, на примере реализации связи:
//получаем пост
$post = Post::find(...)->first();
//получаем eloquent объект автора поста
$author = $post->author;   

Что за магия? Откуда появилось свойство author

Вот так, внутри eloquent прописана связь, доступная как свойство, по имени метода связи:

namespace App\Model;
Class Post extends Model {
    //...
    public function author() {
        return $this->belongsTo(User::class);
    }
}

Теперь, при получении экземпляра поста, можно обращаться к динамическому свойству author (которое прописано у нас как метод), а остальную работу фреймворк сделает за нас, а нам, вернет лишь запись создателя поста. То есть, внутри, фреймворк сам проанализирует таблицу, и подставит нужное значение user_id при получении данных из бд.

Функционал фреймворка поддерживает большое количество типов связей. Связи бывают: один-к-одному, один-ко-многим, многие-к-многим и т.д. Все эти типы будут рассмотрены в следующих статьях.

Связи mysql

Более того, связи можно выстроить на уровне самой базы данных. Это можно сделать на этапе написания миграций в Laravel, или же, через phpmyadmin. Про миграции можно почитать по ссылке во вкладке Foreign Key Constraints. Я же, покажу, как работают связи в mysql, что будет более наглядно.

Представим, что БД имеет 2 таблицы: custoners и orders. В customers содержится вся информация о пользователе, а в orders информация о покупках всех пользователей.

Имея эту информацию, можно понять, что, для того, чтобы привязать информацию о покупке, нужно ввести дополнительное поле customer_id в таблицу orders.

В итоге, таблица orders будет иметь вид:mysql_orders

Но, если кто-то попытается изменить значение customer_id из phpmyadmin, то ему придётся вводить число, которое никак не валидируется, и как итог - большая вероятность ошибки - всегда есть риск записать несуществующее значение.

И вот здесь, на помощь приходит функция связей - позволяет указать таблицу, на которую ссылается значение. По итогу, связи помогают решить несколько явных проблем: создают перелинковку между таблицами (по клику по значение customer_id мы перейдём к конкретному пользователю), и создают "валидацию" из списка всех значений связанной таблицы.

Для создания связи, нужно в нужной таблице (в моём случае - orders) перейти на вкладку Структура - Связи
relation
Где выбрать:

  • Столбец - столбец выбранной таблицы, который ссылается на другую таблицу (внешний ключ)
  • База данных - база данных, в которой находится таблица, на которую ссылаемся
  • Таблица - таблица, на которую ссылаемся
  • Столбец - столбец из таблицы, на которую ссылаемся

После сохранения изменений, связи вступят в силу, и таблица преобразится:
mysql_orders_-------

Вот так просто и была создана простая связь на уровне базы данных: была создана перелинковка между таблицами, и выпадающий список возможных значений из связанной таблицы.

Резюме

Здесь были рассмотрены основы связей, и их реализация в Laravel. Связи помогают проще взаимодействовать с данными из других сущностей, ускоряет и облегчает разработку на фреймворке. Это вводная статья, дальше же, будет создано несколько статей, посвященные более грубокому пониманию связей, и их типов.

Реализация связей в Laravel возможна и без наличия связей в базе данных. Однако, хорошей практикой является создание связей и на уровне Laravel, и Mysql.