上記の答えは私が何が起こっているのかを理解するのに十分ではなかったので、それをさらに掘り下げた後、私が理解したように苦労した人々にとって意味のある説明の方法があると思います。
reversedByとmappedByは、必要な情報を取得するために実行する必要のあるSQLクエリの数を減らすためにINTERNALDOCTRINEエンジンによって使用されます。reversedByまたはmappedByを追加しないかどうかを明確にするために、コードは引き続き機能しますが、最適化されません。
たとえば、以下のクラスを見てください。
class Task
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="task", type="string", length=255)
*/
private $task;
/**
* @var \DateTime
*
* @ORM\Column(name="dueDate", type="datetime")
*/
private $dueDate;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="tasks", cascade={"persist"})
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $category;
}
class Category
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="Task", mappedBy="category")
*/
protected $tasks;
}
これらのクラスは、コマンドを実行してスキーマを生成する場合(たとえばbin/console doctrine:schema:update --force --dump-sql
)、Categoryテーブルにタスク用の列がないことに気付くでしょう。(これは、列の注釈がないためです)
ここで理解しておくべき重要なことは、可変タスクはそこにのみ存在するため、内部のDoctrineエンジンはその上の参照(mappedByカテゴリ)を使用できるということです。さて...ここで私がそうであったように混乱しないでください...カテゴリはクラス名を参照していません。それは「保護された$category」と呼ばれるタスククラスのプロパティを参照しています。
同様に、Tasksクラスでは、プロパティ$categoryがinversedBy = "tasks"であると述べています。これは複数形であることに注意してください。これはクラス名の複数形ではありませんが、プロパティがカテゴリで「保護された$tasks」と呼ばれているからです。クラス。
これを理解すると、inversedByとmappedByが何をしているのか、そしてこの状況でそれらをどのように使用するのかを非常に簡単に理解できるようになります。
私の例で「tasks」のような外部キーを参照している側は、常にinversedBy属性を取得します。これは、そのクラスのどのクラス(targetEntityコマンドを介して)とどの変数(inversedBy =)が「逆方向に機能する」かを知る必要があるためです。話し、からカテゴリ情報を取得します。これを覚える簡単な方法は、foreignkey_idを持つクラスがinversedByを持つ必要があるクラスです。
カテゴリと同様に、その$ tasksプロパティ(テーブルにはありませんが、最適化のためにクラスの一部のみを覚えておいてください)がMappedBy'tasks'であるのに対し、これにより2つのエンティティ間に正式な関係が作成され、Doctrineが安全に使用できるようになります。 2つの別個のSELECTステートメントの代わりに、JOINSQLステートメントを使用してください。マップされたByがないと、ドクトリンエンジンはJOINステートメントから、カテゴリ情報を配置するためにクラス「タスク」にどの変数を作成するかを認識しません。
これがそれをもう少しよく説明することを願っています。