Las respuestas anteriores no fueron suficientes para que yo entendiera lo que estaba pasando, así que después de ahondar más en ello creo que tengo una forma de explicarlo que tendrá sentido para las personas que lucharon como yo para entender.
inversedBy y mappedBy son utilizados por el motor INTERNAL DOCTRINE para reducir el número de consultas SQL que tiene que hacer para obtener la información que necesita. Para ser claros, si no agrega inversedBy o mappedBy, su código seguirá funcionando pero no se optimizará .
Entonces, por ejemplo, mire las clases a continuación:
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;
}
Estas clases, si tuviera que ejecutar el comando para generar el esquema (por ejemplo bin/console doctrine:schema:update --force --dump-sql
), notará que la tabla Categoría no tiene una columna para las tareas. (esto se debe a que no tiene una anotación de columna)
Lo importante que hay que entender aquí es que las tareas variables solo están allí para que el motor de doctrina interno pueda usar la referencia que se encuentra arriba que dice su mappedBy Category. Ahora ... no se confunda aquí como yo ... La categoría NO se refiere al NOMBRE DE LA CLASE , se refiere a la propiedad en la clase de Tarea llamada 'categoría $ protegida'.
Del mismo modo, en la clase Tasks, la propiedad $ categoría menciona que está invertedBy = "tasks", observe que esto es plural, NO ES EL PLURAL DEL NOMBRE DE LA CLASE , pero solo porque la propiedad se llama 'protected $ tasks' en la Categoría clase.
Una vez que comprenda esto, será muy fácil comprender qué están haciendo inversedBy y mappedBy y cómo usarlos en esta situación.
El lado que hace referencia a la clave externa como 'tareas' en mi ejemplo siempre obtiene el atributo inversedBy porque necesita saber qué clase (a través del comando targetEntity) y qué variable (inversedBy =) en esa clase para 'trabajar hacia atrás' para hablar y obtener la información de la categoría. Una forma fácil de recordar esto es que la clase que tendría el Foreignkey_id es la que necesita tener invertedBy.
Donde, al igual que con la categoría, y su propiedad $ tasks (que no está en la tabla, recuerde, solo una parte de la clase para fines de optimización) está asignada por 'tareas', esto crea la relación oficialmente entre las dos entidades para que la doctrina ahora pueda utilice sentencias JOIN SQL en lugar de dos sentencias SELECT independientes. Sin mappedBy, el motor de doctrina no sabría de la declaración JOIN que creará qué variable en la clase 'Tarea' para poner la información de la categoría.
Espero que esto lo explique un poco mejor.