As respostas acima não foram suficientes para eu entender o que estava acontecendo, então, depois de me aprofundar mais, acho que tenho uma maneira de explicar que fará sentido para as pessoas que lutaram como eu entender.
inversedBy e mappedBy são usados pelo mecanismo INTERNAL DOCTRINE para reduzir o número de consultas SQL necessárias para obter as informações de que você precisa. Para ficar claro, se você não adicionar inversedBy ou mappedBy, seu código ainda funcionará, mas não será otimizado .
Então, por exemplo, veja as classes abaixo:
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;
}
Essas classes, se você executar o comando para gerar o esquema (por exemplo, bin/console doctrine:schema:update --force --dump-sql
), notará que a tabela Categoria não possui uma coluna para tarefas. (isso ocorre porque ele não tem uma anotação de coluna nele)
O importante a entender aqui é que as tarefas variáveis estão lá apenas para que o mecanismo de doutrina interno possa usar a referência acima dela que diz sua categoria mappedBy. Agora ... não se confunda aqui como eu estava ... Categoria NÃO está se referindo ao NOME DA CLASSE , está se referindo à propriedade na classe Task chamada 'categoria $ protegida'.
Da mesma forma, na classe Tasks a propriedade $ category menciona que é inversedBy = "tasks", observe que isso é plural, NÃO É O PLURAL DO NOME DA CLASSE , mas apenas porque a propriedade é chamada de 'protected $ tasks' na categoria classe.
Depois de entender isso, torna-se muito fácil entender o que inversedBy e mappedBy estão fazendo e como usá-los nessa situação.
O lado que está referenciando a chave estrangeira como 'tarefas' no meu exemplo sempre obtém o atributo inversedBy porque precisa saber qual classe (por meio do comando targetEntity) e qual variável (inversedBy =) nessa classe 'trabalhar para trás' para fale e obtenha as informações da categoria. Uma maneira fácil de lembrar isso é que a classe que teria o Foreignkey_id é aquela que precisa ter inversedBy.
Onde, como acontece com a categoria, e sua propriedade $ tasks (que não está na mesa, lembre-se, apenas parte da classe para fins de otimização) é MappedBy 'tarefas', isso cria o relacionamento oficialmente entre as duas entidades para que a doutrina agora possa com segurança use instruções SQL JOIN em vez de duas instruções SELECT separadas. Sem mappedBy, o mecanismo de doutrina não saberia a partir da instrução JOIN, ele criará qual variável na classe 'Tarefa' para colocar as informações da categoria.
Espero que isso explique um pouco melhor.