Связи Eloquent
Определяйте связи hasOne, hasMany, belongsTo и «многие ко многим»
«Связи Eloquent» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Зачем нужны связи
Связи Eloquent позволяют запрашивать связанные модели с помощью выразительного PHP вместо необработанных объединений SQL.
hasOne
У User есть один Profile. Определите эту связь в содержащей модель модели.
<?php
class User extends Model {
public function profile(): \Illuminate\Database\Eloquent\Relations\HasOne {
return $this->hasOne(Profile::class);
}
}
// Access:
$profile = $user->profile;belongsTo
Profile принадлежит User. Определите эту связь в модели, содержащей внешний ключ.
<?php
class Profile extends Model {
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo {
return $this->belongsTo(User::class);
}
}
// Access:
$user = $profile->user;hasMany
У User есть много записей Post. Связь «один ко многим» со стороны родительской модели.
<?php
class User extends Model {
public function posts(): \Illuminate\Database\Eloquent\Relations\HasMany {
return $this->hasMany(Post::class);
}
}
// Access:
$posts = $user->posts; // CollectionbelongsTo (сторона «много»)
Каждый Post принадлежит User.
<?php
class Post extends Model {
public function author(): \Illuminate\Database\Eloquent\Relations\BelongsTo {
return $this->belongsTo(User::class, "user_id");
}
}Связь «многие ко многим» (belongsToMany)
У Post есть много тегов, а тег принадлежит многим записям Post — связь проходит через промежуточную таблицу.
<?php
class Post extends Model {
public function tags() {
return $this->belongsToMany(Tag::class);
}
}
// Pivot table: post_tag (post_id, tag_id)
$tags = $post->tags;
$post->tags()->attach($tagId);
$post->tags()->detach($tagId);
$post->tags()->sync([1, 2, 3]);hasManyThrough
Получайте доступ к отдалённо связанным моделям: у Country есть много записей Post через User.
<?php
class Country extends Model {
public function posts() {
return $this->hasManyThrough(Post::class, User::class);
}
}Полиморфные связи
Модель Comment может принадлежать либо Post, либо видео с помощью полиморфных связей.
<?php
class Comment extends Model {
public function commentable() {
return $this->morphTo();
}
}
class Post extends Model {
public function comments() {
return $this->morphMany(Comment::class, "commentable");
}
}Запросы на существование связи
Запрашивайте модели на основе существования связи.
<?php
// Posts that have at least one comment:
$commented = Post::has("comments")->get();
// Posts with >= 3 comments:
$popular = Post::has("comments", ">=", 3)->get();whereHas
Фильтруйте записи по условиям связей.
<?php
$phpPosts = Post::whereHas("tags", function ($q) {
$q->where("name", "PHP");
})->get();Методы связей и динамические свойства
$user->posts() возвращает построитель запросов, поэтому его можно объединять в цепочку. $user->posts возвращает загруженную коллекцию.
Итоги
Определяйте связи как методы, возвращающие hasOne, hasMany, belongsTo или belongsToMany. Обращайтесь к ним как к динамическим свойствам или создавайте цепочки запросов после вызова метода.
Быстрая проверка
Какой тип связи использует промежуточную таблицу?
Часто задаваемые вопросы
Урок «Связи Eloquent» бесплатный?
Да — полный текст урока «Связи Eloquent» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Связи Eloquent»?
Определяйте связи hasOne, hasMany, belongsTo и «многие ко многим» Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Связи Eloquent»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.