上記の答えは私に何が起こっているのかを理解するのに十分ではなかったので、それをさらに掘り下げた後、私が理解したように苦労していた人々にとって理にかなっていると説明できる方法があると思います。
INTERNAL DOCTRINE エンジンは、inversedByおよびmappedByを使用して、必要な情報を取得するために必要なSQLクエリの数を減らします。明確にするために、inversedByまたは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テーブルには、タスク用の列がありません。(これには列の注釈がないためです)
ここで理解しておくべき重要なことは、可変タスクはそこにのみ存在するため、内部のドクトリンエンジンはその上の参照(mappedByカテゴリを示す)を使用できるということです。さて...私がそうだったように、ここで混乱しないでください... カテゴリはクラス名を参照していません。これは、「保護された$ category」と呼ばれるタスククラスのプロパティを参照しています。
同様に、Tasksクラスでは、プロパティ$ categoryはそれがinversedBy = "tasks"であると述べていますが、これは複数であることに注意してください。これはクラス名の数ではありませんが、プロパティがカテゴリで 'protected $ tasks'と呼ばれているためですクラス。
これを理解すると、inversedByとmappedByが何をしているか、そしてこの状況でそれらをどのように使用するかを理解するのが非常に簡単になります。
私の例で 'tasks'のような外部キーを参照している側は常に(inversedBy)属性を取得します。これは、(targetEntityコマンドを介して)クラスと、そのクラスのどの変数(inversedBy =)を知る必要があるためです。話し、カテゴリ情報を取得します。これを覚える簡単な方法は、foreignkey_idを持つクラスが、inversedByを持つ必要があるクラスです。
カテゴリの場合と同様に、その$ tasksプロパティ(テーブルにはありませんが、最適化の目的でクラスの一部のみです)がMappedBy 'tasks'である場合、これにより2つのエンティティ間に公式に関係が作成され、Doctrineが安全にできるようになります2つの個別のSELECTステートメントではなく、JOIN SQLステートメントを使用します。mapsByがない場合、DoctrineエンジンはJOINステートメントからは、クラス情報にどの変数を作成してカテゴリ情報を入れるかを認識しません。
これで少し良くなることを願っています。