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; // 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 は複数の 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Eloquentモデルとマイグレーション
- EloquentでCRUD
- Eloquentのリレーションシップ
- Eager Loadingとクエリスコープ