Le risposte di cui sopra non erano sufficienti per me capire cosa stava succedendo, così dopo scavare in più penso di avere un modo di spiegarlo ha senso per le persone che hanno lottato come ho fatto per capire.
inversedBy e mappedBy sono utilizzati dal DOTTRINA INTERNO motore per ridurre il numero di query SQL ha a che fare per ottenere le informazioni necessarie. Per essere chiari se non si aggiunge inversedBy o mappedBy il codice funzionerà ancora ma non sarà ottimizzato.
Così, per esempio, guardate le classi inferiori:
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;
}
queste classi se si dovesse eseguire il comando per generare lo schema (ad esempio, bin/console doctrine:schema:update --force --dump-sql
) si noterà che la tabella Categoria non ha una colonna su di esso per le attività. (questo perché non ha un'annotazione di colonna su di esso)
La cosa importante da capire qui è che le attività variabili sono solo lì in modo che il motore di dottrina interno possa utilizzare il riferimento sopra di esso che dice la sua mappedBy Category. Ora ... non essere confuso qui come lo ero io ... La categoria NON si riferisce al NOME DELLA CLASSE, si riferisce alla proprietà nella classe Task chiamata 'categoria $ protetta'.
Come saggio, sulla classe Compiti della categoria di proprietà $ menziona è inversedBy = "compiti", notare questo è plurale, questo non è il plurale del nome della classe, ma solo perché la proprietà è chiamata 'protetto $ tasks 'nella classe Category.
Una volta compreso questo diventa molto facile capire cosa stanno inversedBy e mappedBy e come usarli in questa situazione.
Il lato che fa riferimento alla chiave esterna come "attività" nel mio esempio ottiene sempre l'attributo inversedBy perché ha bisogno di sapere quale classe (tramite il comando targetEntity) e quale variabile (inversedBy =) su quella classe a 'lavoro indietro per così dire e ottenere le informazioni sulla categoria da. Un modo semplice per ricordare questo, è la classe che avrebbe foreignkey_id è quello che ha bisogno di essere inversedBy.
Dove come con la categoria e la sua proprietà $ tasks (che non è presente sulla tabella, solo una parte della classe per scopi di ottimizzazione) è MappedBy "tasks", crea la relazione ufficialmente tra le due entità in modo tale che la doctrina ora può tranquillamente utilizzare le istruzioni JOIN SQL invece di due istruzioni SELECT separate. Senza mappedBy, il motore doctrine non saprebbe dall'istruzione JOIN che creerà quale variabile nella classe 'Task' per inserire le informazioni sulla categoria.
Spero che questo lo spieghi un po 'meglio.
Stranamente l'Analizzatore dottrina ha deciso di lasciare fuori l'esempio yaml di una relazione molti-a-uno mappatura bidirezionale, probabilmente il più comunemente usato! –
@PeterWooster, la migliore pratica è usare le annotazioni, dato che hai tutte le informazioni sull'entità in un posto! –
Questo vale anche per molte o molte relazioni. Per quelli: puoi scegliere tu stesso il lato proprietario di un'associazione many-to-many. – 11mb