Die Antworten oben waren nicht ausreichend für mich zu verstehen, was los war, so nach dem in sie einzutauchen mehr ich glaube, ich habe einen Weg es zu erklären, dass es Sinn macht für Leute, die kämpfen mussten, wie ich es verstand.
inversedBy und mappedBy durch die INTERNE LEHRE verwendet werden Motor die Anzahl der SQL-Abfragen reduzieren es zu tun hat, die Informationen die Sie benötigen. Um klar zu sein, wenn Sie inversedBy oder mappedBy nicht hinzufügen, wird Ihr Code immer noch funktionieren, wird aber nicht optimiert sein.
So zum Beispiel, betrachten Sie die unten angegebenen Klassen:
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;
}
Diese Klassen, wenn Sie den Befehl auszuführen waren, das Schema zu generieren (zB bin/console doctrine:schema:update --force --dump-sql
) Sie werden feststellen, dass die Kategorie Tabelle nicht eine Spalte für Aufgaben. (das ist, weil es keine Spaltenannotation darauf hat)
Die wichtige Sache, die hier zu verstehen ist, ist, dass die Variable Aufgaben nur dort ist, so kann die interne Doktrin-Engine die Referenz darüber verwenden, die ihre mappedBy-Kategorie angibt. Nun ... sei hier nicht verwirrt wie ich war ... Kategorie bezieht sich NICHT auf die Klasse NAME, es bezieht sich auf die Eigenschaft auf der Task-Klasse namens 'protected $ category'.
Wie weise, auf die Klasse Aufgaben der Eigenschaft $ Kategorie es erwähnt ist inversedBy = „Aufgaben“, bemerken diese Plural ist, dies nicht der PLURAL des Klassennamens ist, aber nur, weil die Eigenschaft genannt ‚geschützt $ tasks 'in der Category-Klasse.
Sobald Sie dies verstehen, wird es sehr einfach zu verstehen, was inversedBy und mappedBy tun und wie Sie sie in dieser Situation verwenden. Die Seite, die den Fremdschlüssel wie "Aufgaben" in meinem Beispiel referenziert, erhält immer das Attribut inversedBy, weil sie wissen muss, welche Klasse (über den targetEntity-Befehl) und welche Variable (inversedBy =) für diese Klasse "funktioniert" rückwärts 'sozusagen und holen Sie sich die Kategorie Informationen aus. Eine einfache Möglichkeit, sich daran zu erinnern, ist die Klasse, die die Fremdschlüssel-ID haben müsste, die inversedBy haben muss.
Wo wie mit Kategorie, und seine $ tasks -Eigenschaft (die nicht auf der Tabelle zu erinnern, nur ein Teil der Klasse für Optimierungszwecke) ist MappedBy "Aufgaben", erstellt dies die Beziehung offiziell zwischen den beiden Entitäten so doctrine kann jetzt JOIN SQL-Anweisungen anstelle von zwei separaten SELECT-Anweisungen verwenden. Ohne mappedBy würde die Doktrin-Engine aus der JOIN-Anweisung nicht wissen, welche Variable in der Klasse 'Task' erstellt wird, um die Kategorieinformationen zu setzen.
Hoffe das erklärt es ein bisschen besser.
Seltsamer die Lehre documenter beschlossen, das yaml Beispiel für eine many-to-one bidirektionale Mapping auszulassen, wahrscheinlich das am häufigsten verwendete! –
@PeterWooster, Best Practice ist Annotationen zu verwenden, da Sie alle Informationen über die Entität an einem Ort haben! –
Dies gilt auch für viele zu viele Beziehungen. Für diejenigen: Sie können selbst die Eigentümerseite einer Viele-zu-Viele-Assoziation auswählen. – 11mb