ইনভার্সডবাই এবং ম্যাপডবাইয়ের মধ্যে পার্থক্য কী?


102

আমি জেন্ডার ফ্রেমওয়ার্ক 2 এবং মতবাদ 2 ব্যবহার করে আমার অ্যাপ্লিকেশনটি বিকাশ করছি।

টীকাগুলি লেখার সময়, আমি mappedByএবং এর মধ্যে পার্থক্য বুঝতে অক্ষম inversedBy

আমার কখন ব্যবহার করা উচিত mappedBy?

আমার কখন ব্যবহার করা উচিত inversedBy?

আমি কখনই ব্যবহার করব না?

এখানে একটি উদাহরণ:

 /**
 *
 * @ORM\OneToOne(targetEntity="\custMod\Entity\Person", mappedBy="customer")
 * @ORM\JoinColumn(name="personID", referencedColumnName="id")
 */
protected $person;

/**
 *
 * @ORM\OneToOne(targetEntity="\Auth\Entity\User")
 * @ORM\JoinColumn(name="userID", referencedColumnName="id")
 */
protected $user;

/**
 *
 * @ORM\ManyToOne (targetEntity="\custMod\Entity\Company", inversedBy="customer")
 * @ORM\JoinColumn (name="companyID", referencedColumnName="id")
 */
protected $company;

আমি একটি দ্রুত অনুসন্ধান করেছি এবং নিম্নলিখিতগুলি পেয়েছি, তবে আমি এখনও বিভ্রান্ত রয়েছি:

উত্তর:


159
  • ম্যাপডবাইকে একটি ( দ্বিদলিত ) সমিতির বিপরীত দিকে নির্দিষ্ট করতে হবে
  • ইনভার্সডবি দ্বারা (দ্বি নির্দেশমূলক ) সমিতির নিজস্ব পক্ষের নির্দিষ্ট করতে হবে

মতবাদ নথি থেকে:

  • ম্যান্টিটওন সর্বদা একটি দ্বিদ্বন্দ্বী সহযোগিতার নিজস্ব পক্ষ side
  • ওয়ানটোম্যানি সর্বদা একটি দ্বি নির্দেশমূলক সহযোগিতার বিপরীত দিক।
  • OneToOne সহযোগিতার নিজস্ব পক্ষ হ'ল বিদেশী কীযুক্ত টেবিলযুক্ত সত্তা।

Https://www.doctrine-project.org/projects/doctrine-orm/en/latest/references/unitofwork-associations.html দেখুন


1
অদ্ভুতভাবে ডক্ট্রিন ডকুমেন্টামেন্ট সিদ্ধান্ত নিয়েছে যে একাধিক টু ওয়ান দ্বি-নির্দেশমূলক ম্যাপিংয়ের যামল উদাহরণটি সম্ভবত সর্বাধিক ব্যবহৃত!
পিটার উস্টার

4
@ পিটারওস্টার, সেরা অনুশীলন হ'ল টীকাগুলি ব্যবহার করা, যেমন আপনার কাছে সত্তা সম্পর্কে সমস্ত তথ্য এক জায়গায় রয়েছে!
আন্দ্রে লিন্ডেন

এটি অনেক সম্পর্কের ক্ষেত্রেও অনেককে প্রযোজ্য। তাদের জন্য: আপনি নিজেরাই অনেকগুলি থেকে বহু সংস্থার মালিকানা বেছে নিতে পারেন।
11

5
@ আন্ড্রেস লিন্ডেন ব্যাপকভাবে ব্যবহৃত হওয়ার অর্থ সর্বোত্তম অনুশীলন নয়। ফ্লাইতে কোড লেখার জন্য মন্তব্যগুলি ব্যবহার করে এমন কিছু কখনও সেরা অনুশীলন হিসাবে বিবেচনা করা যায় না, এটি পিএইচপি নেটিভ নয়, এমনকি সমস্ত ফ্রেমওয়ার্কগুলিতে ডিফল্টরূপে অন্তর্ভুক্তও নয়। এক জায়গায় সত্তা সম্পর্কে সমস্ত তথ্য থাকা একটি বিরোধী যুক্তি। যেহেতু আপনার সমস্ত কোডকে এক জায়গায় ভাগ করে নেওয়া ভাল জিনিস? এটি লেখার জন্য ব্যথা, বজায় রাখতে একটি ব্যথা এবং আপনার প্রকল্পে সংগঠন হ্রাস করা। ভাল অভ্যাস ? Duh।
জেসুস দ্য হুন

3
@ জেসুসহান আপনি আপেল এবং নাশপাতির তুলনা করছেন। "সমস্ত কোড" "সত্তা সম্পর্কে সমস্ত তথ্য" এর তুলনায় খুব আলাদা ";)
আন্দ্রে লিন্ডেন

55

কী চলছে তা বোঝার জন্য উপরের উত্তরগুলি আমার পক্ষে যথেষ্ট ছিল না, তাই এটির আরও বেশি খোঁজ নেওয়ার পরে আমি মনে করি আমার কাছে এটি ব্যাখ্যা করার একটি উপায় রয়েছে যাঁরা বুঝতে পেরেছিলেন তাদের মতো যারা সংগ্রাম করেছিলেন তাদের পক্ষে তা বোধগম্য হবে।

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 স্টেটমেন্টের পরিবর্তে যোগদান করুন এসকিউএল স্টেটমেন্ট। ম্যাপডবাই ব্যতীত, মতবাদ ইঞ্জিনটি জওআইএন বিবৃতি থেকে জানতে পারে না যে এটি বিভাগের তথ্য রাখার জন্য 'টাস্ক' শ্রেণিতে কী পরিবর্তনশীল তা তৈরি করবে।

আশা করি এটি কিছুটা ভাল ব্যাখ্যা করেছেন।


6
এটি খুব ভালভাবে ব্যাখ্যা করা হয়েছে এবং আপনার প্রচেষ্টার জন্য ধন্যবাদ। আমি লারাভেল এলওভার থেকে মতবাদে এসেছি এবং এখানে যুক্তি বুঝতে আমার পক্ষে কষ্টসাধ্য ছিল। সাবাশ. Category is NOT referring TO THE CLASS NAME, its referring to the property on the Task class called 'protected $category'আমার যা দরকার ছিল। এটি কেবল আমার সমস্যার সমাধান করেনি তবে এটি আমাকে বুঝতে সহায়তা করেছে। সেরা উত্তর আইএমও :-)
আলফা

1
আমিও বুদ্ধিমানের কাছ থেকে এসেছি, এটি আমাকে অনেক সাহায্য করেছিল। এখন আমার একমাত্র স্টিকিং পয়েন্টটি কীভাবে এটির জন্য সেটটার / গেটার সেট করতে হয়, আমি এখনও এর উপরে দড়ি শিখছি
ইমান

1
হ্যাঁ এটি সত্যিই সহজ এবং এমনকি কিছু সরঞ্জামের সাথে স্বয়ংক্রিয়ভাবে তৈরি হয়েছে, আমার সাথে পরে চ্যাট শুরু করুন এবং আমি আপনাকে সাহায্য করতে পারি
জোসেফ আস্ট্রাহান

1
এই উত্তরটি দেখুন, stackoverflow.com/questions/16629397/...
জোসেফ Astrahan

1
symfony.com/doc/current/doctrine/associations.html , এটি শেখা আসলে ভাল, সিমফনি মতবাদ ব্যবহার করে তাই এটি আপনাকে একই জিনিস শেখাবে teach
জোসেফ আস্ট্রাহান

21

দ্বিপাক্ষিক সম্পর্কের ক্ষেত্রে একটি নিজস্ব দিক এবং বিপরীত দিক উভয়ই থাকে

ম্যাপডবাই : দ্বিপাক্ষিক সম্পর্কের বিপরীত দিকে রাখুন এর নিজস্ব দিকটি উল্লেখ করুন

বিপরীতমুখী বাই : দ্বি নির্দেশমূলক সম্পর্কের নিজস্ব দিকটিতে রাখুন এর বিপরীত দিকটি উল্লেখ করুন

এবং

ওয়ানটোইন , ওয়ানটোম্যানি বা ম্যান্টিটোম্যানি ম্যাপিং ঘোষণার সাথে ম্যাপডবাই অ্যাট্রিবিউট ব্যবহার করা হয়।

ওয়ানটোন , ম্যান্টি টোওনে, বা ম্যান্টিটোম্যানি ম্যাপিং ঘোষণার সাথে ইনভার্সডবি বৈশিষ্ট্য ব্যবহৃত হয়

বিজ্ঞপ্তি : একটি দ্বি নির্দেশমূলক সম্পর্কের নিজস্ব দিকটি যে দিকে বিদেশী কী রয়েছে contains

ডক্ট্রাইন ডকুমেন্টেশনে ইনভার্সডবাই এবং ম্যাপডবাই সম্পর্কে দুটি উল্লেখ রয়েছে: প্রথম লিঙ্ক , দ্বিতীয় লিঙ্ক


1
লিঙ্কগুলি মারা গেছে?
স্কারামাউচে

2

5.9.1। মালিকানা এবং বিপরীত দিক

বহু-বহু-সংখ্যক সংঘের জন্য আপনি বেছে নিতে পারেন কোন সত্তার মালিকানা এবং কোনটি বিপরীত দিক। বিকাশকারীদের দৃষ্টিকোণ থেকে কোন দিকটি নিজের পক্ষে থাকার পক্ষে আরও উপযুক্ত তা সিদ্ধান্ত নেওয়ার জন্য একটি খুব সাধারণ সিমেটিক নিয়ম রয়েছে। আপনাকে কেবল নিজেকে জিজ্ঞাসা করতে হবে, সংযোগ ব্যবস্থাপনার জন্য কোন সত্তা দায়বদ্ধ এবং এটিকে নিজের পক্ষ হিসাবে বেছে নিতে হবে।

নিবন্ধ এবং ট্যাগ দুটি সত্তার উদাহরণ নিন। আপনি যখনই কোনও নিবন্ধকে কোনও ট্যাগ এবং তদ্বিপরীতের সাথে সংযুক্ত করতে চান, তবে বেশিরভাগ ক্ষেত্রে নিবন্ধটিই এই সম্পর্কের জন্য দায়ী। আপনি যখনই কোনও নতুন নিবন্ধ যুক্ত করবেন, আপনি এটি বিদ্যমান বা নতুন ট্যাগের সাথে সংযুক্ত করতে চান। আপনার তৈরি নিবন্ধের ফর্মটি সম্ভবত এই ধারণাকে সমর্থন করবে এবং সরাসরি ট্যাগগুলি নির্দিষ্ট করার অনুমতি দেবে। এই কারণেই কোডটি আরও বোধগম্য হওয়ায় আপনার নিজের আর্টিকেলটি নিজের পক্ষ হিসাবে বেছে নেওয়া উচিত:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.