কী চলছে তা বোঝার জন্য উপরের উত্তরগুলি আমার পক্ষে যথেষ্ট ছিল না, তাই এটির আরও বেশি খোঁজ নেওয়ার পরে আমি মনে করি আমার কাছে এটি ব্যাখ্যা করার একটি উপায় রয়েছে যাঁরা বুঝতে পেরেছিলেন তাদের মতো যারা সংগ্রাম করেছিলেন তাদের পক্ষে তা বোধগম্য হবে।
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
) আপনি খেয়াল করবেন যে বিভাগের টেবিলের কাজগুলির জন্য এতে কোনও কলাম নেই। (এটি কারণ এটিতে একটি কলাম টীকা নেই)
এখানে গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে যে পরিবর্তনশীল কাজগুলি কেবল সেখানে থাকে তাই অভ্যন্তরীণ মতবাদ ইঞ্জিনটি তার উপরের রেফারেন্সটি ব্যবহার করতে পারে যা তার ম্যাপডবাই বিভাগ বলে। এখন ... এখানে যেমন ছিল তেমন বিভ্রান্ত হবেন না ... বিভাগটি ক্লাস নামটির উল্লেখ করছে না , এটি 'সুরক্ষিত $ বিভাগ' নামে পরিচিত টাস্ক ক্লাসের সম্পত্তিটির উল্লেখ করে।
বুদ্ধিমানের মতো, টাস্ক ক্লাসে সম্পত্তি $ বিভাগে উল্টোটি বলা হয় = "কাজগুলি", এটি বহুবচনের বিষয়টি লক্ষ্য করুন, এটি শ্রেণীর নামটির বহুবচন নয় , তবে কেবল কারণ শ্রেণিতে সম্পত্তিটিকে 'সুরক্ষিত $ কার্য' বলা হয় because বর্গ।
একবার আপনি এটি বুঝতে পারলে ইনভার্সডবাই এবং ম্যাপডবাই কী করছেন এবং কীভাবে এই পরিস্থিতিতে তাদের ব্যবহার করবেন তা বোঝা খুব সহজ হয়ে যায়।
আমার উদাহরণে 'টাস্ক'-এর মতো বিদেশী কী উল্লেখ করার দিকটি সর্বদা ইনভার্সডবি বৈশিষ্ট্য লাভ করে কারণ এটি জানতে হবে যে শ্রেণিটি (টার্গেটইন্টি কমান্ডের মাধ্যমে) এবং কোন শ্রেণীর (উল্টা বাই =)' শ্রেণির পিছনে কাজ 'করতে হবে কথা বলুন এবং থেকে বিভাগের তথ্য পান। এটি মনে রাখার একটি সহজ উপায়, সেই ক্লাসটি যা বিদেশি_আইডি থাকবে সেটিই একটি বিপরীতমুখী হওয়া দরকার।
বিভাগ হিসাবে এবং তার $ কার্য সম্পত্তি হিসাবে (যা টেবিলের উপরে নেই মনে রাখবেন, অপ্টিমাইজেশনের উদ্দেশ্যে শ্রেণীর একমাত্র অংশ) ম্যাপডবাই 'কার্য', এটি দুটি সত্তার মধ্যে অফিসিয়ালি সম্পর্ক তৈরি করে যাতে মতবাদটি এখন নিরাপদে থাকতে পারে দুটি পৃথক SELECT স্টেটমেন্টের পরিবর্তে যোগদান করুন এসকিউএল স্টেটমেন্ট। ম্যাপডবাই ব্যতীত, মতবাদ ইঞ্জিনটি জওআইএন বিবৃতি থেকে জানতে পারে না যে এটি বিভাগের তথ্য রাখার জন্য 'টাস্ক' শ্রেণিতে কী পরিবর্তনশীল তা তৈরি করবে।
আশা করি এটি কিছুটা ভাল ব্যাখ্যা করেছেন।