คำตอบข้างต้นไม่เพียงพอสำหรับฉันที่จะเข้าใจสิ่งที่เกิดขึ้นดังนั้นหลังจากเจาะลึกมากขึ้นฉันคิดว่าฉันมีวิธีอธิบายที่จะสมเหตุสมผลสำหรับคนที่ดิ้นรนอย่างฉันจะเข้าใจ
inversedBy และ mappedBy ถูกใช้โดยเอ็นจิ้น INTERNAL DOCTRINEเพื่อลดจำนวนคิวรี SQL ที่ต้องทำเพื่อให้ได้ข้อมูลที่คุณต้องการ ต้องมีความชัดเจนถ้าคุณไม่ได้เพิ่ม inversedBy หรือ 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 Category ตอนนี้ ... อย่าสับสนที่นี่เหมือนที่ฉันเป็น ... หมวดหมู่ไม่ได้หมายถึง CLASS NAMEซึ่งหมายถึงคุณสมบัติในคลาสงานที่เรียกว่า 'ประเภท $ ที่ได้รับการป้องกัน'
เช่นเดียวกับที่ชาญฉลาดในคลาส Tasks คุณสมบัติที่ $ ระบุว่าเป็น inversedBy = "งาน" สังเกตว่านี่เป็นพหูพจน์นี่ไม่ใช่ PLURAL ของ CLASS NAMEแต่เป็นเพราะคุณสมบัติถูกเรียกว่า 'protected $ งาน' ในหมวดหมู่ ชั้นเรียน.
เมื่อคุณเข้าใจสิ่งนี้แล้วมันจะง่ายมากที่จะเข้าใจว่า inversedBy และ mappedBy กำลังทำอะไรอยู่และจะใช้มันอย่างไรในสถานการณ์นี้
ด้านที่อ้างถึงคีย์ต่างประเทศเช่น 'งาน' ในตัวอย่างของฉันมักจะได้รับแอตทริบิวต์ inversedBy เนื่องจากต้องการทราบว่าคลาสใด (ผ่านคำสั่ง targetEntity) และตัวแปรใด (inversedBy =) ในคลาสนั้นเพื่อ 'ทำงานย้อนกลับ' เพื่อ พูดและรับข้อมูลหมวดหมู่จาก วิธีง่ายๆในการจำสิ่งนี้คือคลาสที่จะมี Foreignkey_id คือคลาสที่ต้องมี inversedBy
ในกรณีที่เป็นหมวดหมู่และคุณสมบัติ $ งาน (ซึ่งไม่ได้อยู่ในตารางโปรดจำไว้ว่าเพียงส่วนหนึ่งของคลาสเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพ) คือ MappedBy 'งาน' สิ่งนี้จะสร้างความสัมพันธ์อย่างเป็นทางการระหว่างทั้งสองเอนทิตีเพื่อให้หลักคำสอนสามารถทำได้อย่างปลอดภัย ใช้คำสั่ง JOIN SQL แทนสองคำสั่ง SELECT แยกกัน หากไม่มีการแมปโดยเครื่องมือหลักคำสอนจะไม่ทราบจากคำสั่ง JOIN มันจะสร้างตัวแปรอะไรในคลาส 'งาน' เพื่อใส่ข้อมูลหมวดหมู่
หวังว่านี่จะอธิบายได้ดีขึ้นเล็กน้อย