0Pricing
PHP Academy · Урок

Связи 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; // Collection

belongsTo (сторона «много»)

Каждый 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 — локальная установка не требуется.

Все уроки этого курса

  1. Модели и миграции Eloquent
  2. CRUD с Eloquent
  3. Связи Eloquent
  4. Предварительная загрузка и области запросов
← Назад к PHP Academy