0Pricing
PHP Academy · レッスン

Eloquentのリレーションシップ

hasOne、hasMany、belongsTo、多対多のリレーションシップを定義します

「Eloquentのリレーションシップ」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

リレーションシップを使う理由

Eloquent のリレーションシップを使用すると、生の SQL JOIN の代わりに、表現力の高い PHP で関連モデルをクエリできます。

hasOne

User は 1 つの 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 は複数の Tag を持ち、Tag は複数の 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

遠 indirect に関連するモデルにアクセスします。Country は User を介して複数の Post を持ちます。

<?php
class Country extends Model {
    public function posts() {
        return $this->hasManyThrough(Post::class, User::class);
    }
}

ポリモーフィックリレーションシップ

Comment モデルは、ポリモーフィックリレーションシップを使用して Post または Video のいずれかに属せます。

<?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 は読み込み済みの Collection を返します。

まとめ

リレーションシップは、hasOne、hasMany、belongsTo、belongsToMany を返すメソッドとして定義します。動的プロパティとしてアクセスするか、メソッド呼び出しの結果に対してクエリを連結できます。

確認問題

中間テーブルを使用するリレーションシップの種類はどれですか?

よくある質問

「Eloquentのリレーションシップ」レッスンは無料ですか?

はい。「Eloquentのリレーションシップ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「Eloquentのリレーションシップ」で何を学びますか?

hasOne、hasMany、belongsTo、多対多のリレーションシップを定義します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Eloquentのリレーションシップ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Eloquentモデルとマイグレーション
  2. EloquentでCRUD
  3. Eloquentのリレーションシップ
  4. Eager Loadingとクエリスコープ
← PHP Academyに戻る