カテゴリ: Symfony 更新日: 2025/12/19

Symfony Doctrine ORMのリレーションを完全ガイド!初心者でもわかるOneToOne・OneToManyの使い方

Doctrineでリレーションを定義する方法(OneToOne/Many)
Doctrineでリレーションを定義する方法(OneToOne/Many)

先生と生徒の会話形式で理解しよう

生徒

「SymfonyのDoctrine ORMでデータ同士をつなげるリレーションってどうやって定義するんですか?」

先生

「リレーションとは、データ同士の関係性を表す仕組みのことで、Symfonyではとてもよく使う重要な概念なんだよ。」

生徒

「OneToOneとかOneToManyという言葉は聞いたことがありますが、具体的にどういう意味なんでしょう?」

先生

「それでは、初心者でもわかるように、身近なたとえを使いながら丁寧に説明していこう。」

1. Doctrine ORMのリレーションとは?

1. Doctrine ORMのリレーションとは?
1. Doctrine ORMのリレーションとは?

SymfonyのDoctrine ORMでいうリレーションとは、エンティティ同士のつながりのことです。データベースには多くのテーブルがあり、そのテーブル同士がどのように関係しているかを表す仕組みが必要です。

初心者向けに例えると、リレーションは「家族や友達関係」のようなものです。ひとりの人がひとつの家と結びついていたり、複数の友達とつながっていたりするように、データ同士にもさまざまな関係があります。

Doctrineではこの関係をアノテーション(@OneToOneなど)を使って定義することで、データの関連付けを簡単に扱えるようになります。

2. OneToOneリレーションとは?

2. OneToOneリレーションとは?
2. OneToOneリレーションとは?

OneToOne(1対1)とは、ひとつのデータに対して、ひとつだけ関連するデータが存在する関係です。たとえば、「ユーザー」とその「プロフィール」は1対1の関係で結びつけられます。

日常の例で言うと、「ひとりの人にひとつのパスポートが発行される」ようなイメージです。

■ OneToOneのサンプルコード


#[ORM\OneToOne(targetEntity: Profile::class, cascade: ['persist'])]
private $profile;

このコードは「UserエンティティはProfileエンティティと1対1で結びついている」という意味です。cascadeのpersistは「Userを保存したときProfileも保存する」という設定です。

3. OneToMany / ManyToOneリレーションとは?

3. OneToMany / ManyToOneリレーションとは?
3. OneToMany / ManyToOneリレーションとは?

OneToMany(1対多)とは、ひとつのデータに対して複数の関連データが存在する関係です。逆に、ManyToOne(多対1)は複数のデータがひとつのデータに紐づく関係を指します。

日常生活で例えると、「学校のクラスと生徒」の関係がわかりやすいです。 ・ひとつのクラスに複数の生徒が所属 → OneToMany ・生徒は必ずひとつのクラスに所属 → ManyToOne

■ OneToMany / ManyToOneのサンプルコード


#[ORM\OneToMany(mappedBy: 'classRoom', targetEntity: Student::class)]
private $students;

#[ORM\ManyToOne(targetEntity: ClassRoom::class, inversedBy: 'students')]
private $classRoom;

上記のコードでは、ClassRoomは複数のStudentを持ち、StudentはひとつのClassRoomに所属するという関係が定義されています。「mappedBy」は反対側のプロパティの名前を指定する役割があります。

4. ManyToManyリレーションとは?

4. ManyToManyリレーションとは?
4. ManyToManyリレーションとは?

ManyToMany(多対多)は、複数のデータが複数のデータに紐づく複雑な関係です。たとえば「生徒とクラブ活動」が典型的です。

日常の例: ・複数の生徒が複数のクラブに参加できる ・クラブも複数の生徒を持てる これが多対多の関係です。

■ ManyToManyのサンプルコード


#[ORM\ManyToMany(targetEntity: Club::class)]
private $clubs;

多対多では中間テーブルが自動で生成されるため、データベース設計を意識しなくても扱いやすくなっています。

5. Doctrineリレーションでよくある疑問と注意点

5. Doctrineリレーションでよくある疑問と注意点
5. Doctrineリレーションでよくある疑問と注意点

Doctrine ORMでリレーションを扱うと、「どちら側で設定すればいいのか」「mappedBy/inversedByの違い」「cascadeの使い方」など、最初は複雑に感じる部分もあります。

初心者向けにポイントを整理すると次のとおりです。

● mappedByとは?
「相手側で定義しているプロパティの名前」です。OneToMany側に設定します。

● inversedByとは?
「このリレーションを反対側から参照するときのプロパティ」です。ManyToOne側に設定します。

● cascadeとは?
関連データを一緒に保存・削除する設定で、初心者がよくつまずく部分です。

Doctrineはこれらの関係を自動で処理してくれるため、Symfonyではエンティティ同士のつながりを直感的に扱うことができます。

関連記事:
カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティング構成の基本を完全解説!初心者向けにYAML・PHP・アノテーション方式をやさしく紹介
New2
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法
New3
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
New4
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPで文字列を結合する方法!ドット演算子と代入演算子の使い方を徹底解説
No.2
Java&Spring記事人気No2
PHP
PHPのif文の使い方を完全ガイド!初心者でもわかる条件分岐の基本
No.3
Java&Spring記事人気No3
Symfony
Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
No.4
Java&Spring記事人気No4
Laravel
Laravelのresponse()関数の使い方を完全ガイド!初心者でもわかるレスポンス制御とHTTPレスポンスの基本
No.5
Java&Spring記事人気No5
Laravel
LaravelのAPIルーティングを設定する方法!初心者でもわかるapi.phpの使い方
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterルーティングを完全攻略!正規表現でURLを自由自在に操る方法
No.7
Java&Spring記事人気No7
Laravel
LaravelでRemember Me(ログイン状態保持)機能を実装する方法を完全解説!初心者でも安心の認証入門
No.8
Java&Spring記事人気No8
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点