Что такое связи в 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 будет иметь вид:
Но, если кто-то попытается изменить значение customer_id из phpmyadmin, то ему придётся вводить число, которое никак не валидируется, и как итог - большая вероятность ошибки - всегда есть риск записать несуществующее значение.
И вот здесь, на помощь приходит функция связей - позволяет указать таблицу, на которую ссылается значение. По итогу, связи помогают решить несколько явных проблем: создают перелинковку между таблицами (по клику по значение customer_id мы перейдём к конкретному пользователю), и создают "валидацию" из списка всех значений связанной таблицы.
Для создания связи, нужно в нужной таблице (в моём случае - orders) перейти на вкладку Структура
- Связи
Где выбрать:
- Столбец - столбец выбранной таблицы, который ссылается на другую таблицу (внешний ключ)
- База данных - база данных, в которой находится таблица, на которую ссылаемся
- Таблица - таблица, на которую ссылаемся
- Столбец - столбец из таблицы, на которую ссылаемся
После сохранения изменений, связи вступят в силу, и таблица преобразится:
Вот так просто и была создана простая связь на уровне базы данных: была создана перелинковка между таблицами, и выпадающий список возможных значений из связанной таблицы.
Резюме
Здесь были рассмотрены основы связей, и их реализация в Laravel. Связи помогают проще взаимодействовать с данными из других сущностей, ускоряет и облегчает разработку на фреймворке. Это вводная статья, дальше же, будет создано несколько статей, посвященные более грубокому пониманию связей, и их типов.
Реализация связей в Laravel возможна и без наличия связей в базе данных. Однако, хорошей практикой является создание связей и на уровне Laravel, и Mysql.