Наведених вище відповідей було недостатньо для того, щоб я зрозумів, що відбувається, тому після того, як я більше заглиблююся в це, я думаю, що у мене є спосіб його пояснення, який матиме сенс для людей, які боролися, як і я.
inversedBy і mappedBy використовуються ВНУТРІШНІ ДОКТРИНИ двигуна зменшити кількість запитів SQL він повинен зробити , щоб отримати необхідну інформацію. Щоб було зрозуміло, якщо ви не додасте перевернутеBy чи 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
), ви помітите, що в таблиці Категорія немає стовпчика на ній для завдань. (це тому, що на ньому немає анотації стовпців)
Тут важливо розуміти, що змінні завдання існують лише для того, щоб внутрішній двигун вчення міг використовувати посилання над ним, яке говорить про його категорію mappedBy. Тепер ... не плутайте тут, як я ... Категорія НЕ посилається на ІМЯ КЛАСУ , його посилання на властивість класу Завдання під назвою "захищена $ категорія".
Як і мудрий, у класі Tasks властивість $ категорії згадує, що це inversedBy = "задачі", зауважте, що це множина, це НЕ ПЛЮСЬ ІМЕНЯ КЛАСУ , а лише тому, що властивість називається "захищеними $ завданнями" у категорії клас.
Після того, як ви це зрозумієте, стає дуже легко зрозуміти, що роблять перевернутіBy та mappedBy та як їх використовувати в цій ситуації.
Сторона, яка в моєму прикладі посилається на іноземний ключ, наприклад, "завдання", завжди отримує атрибут inversedBy, оскільки він повинен знати, який клас (за допомогою команди targetEntity) та яку змінну (inversedBy =) у цьому класі, щоб "працювати назад", щоб говорити та отримувати інформацію про категорію. Простий спосіб запам’ятати це - клас, у якому був би іноземний_ід той, який повинен бути перевернутимBy.
Якщо як з категорією, так і її властивістю $ задань (якої немає на столі, пам’ятайте, лише лише частина класу для оптимізації) є «завданнями» MappedBy, це створює офіційні відносини між двома сутностями, щоб доктрина тепер могла безпечно використовувати JOIN SQL заяви замість двох окремих операторів SELECT. Без mappedBy, двигун доктрини не знав би з оператора JOIN, він створить, яку змінну в класі "Завдання" класти інформацію про категорії.
Сподіваюся, це пояснює це трохи краще.