2012-07-03 8 views
7

संस्थाओं के बीच रिश्तों के निर्माण की व्याख्या करने के लिए मुझे दस्तावेज बहुत खराब लगता है। इसलिए, मुझे अपने साथी स्टैक एक्सचेंजर्स को मदद मांगी होगी। तो, मैं निम्नलिखित मामलों का निर्माण करने की कोशिश कर रहा हूँ:सिम्फनी और सिद्धांत में कई और कई लोगों के लिए कैसे?

केस 1

एक User एक या अधिक Group के अंतर्गत आता है, और एक Group कई Permission हो सकता है। User में Permission भी हो सकता है।

प्रकरण 2

एक Ticket एक Category, कई Tag और कई Comment है।

अग्रिम धन्यवाद!

उत्तर

17

निश्चित बात। समझने वाली पहली बात यह है कि ऐसा करने के लिए कोई "एक रास्ता" नहीं है। यह सिद्धांत define the relationship के संदर्भ में बहुत लचीलापन देता है - भले ही एकाधिक परिभाषाएं समान डीडीएल उत्पन्न करती हैं (और यह समझना महत्वपूर्ण है - कुछ मैपिंग विकल्प केवल ओआरएम के ऑब्जेक्ट-साइड को प्रभावित करते हैं, मॉडल-पक्ष नहीं)

यहाँ अपने उपयोगकर्ता/समूहों/अनुमतियां उदाहरण है, जो वास्तव में सभी कई-से-अनेक संघों (मैं सभी गैर-प्रासंगिक बाहर रखा गया है, लेकिन कोड की आवश्यकता, पी स्तंभ परिभाषा की तरह)

<?php 

namespace Your\Bundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * Many-To-Many, Unidirectional 
    * 
    * @var ArrayCollection $groups 
    * 
    * @ORM\ManyToMany(targetEntity="Group") 
    * @ORM\JoinTable(name="user_has_group", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $groups; 

    /** 
    * Many-To-Many, Unidirectional 
    * 
    * @var ArrayCollection $permissions 
    * 
    * @ORM\ManyToMany(targetEntity="Permission") 
    * @ORM\JoinTable(name="user_has_permission", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $permissions; 

    public function __construct() 
    { 
    $this->groups = new ArrayCollection(); 
    $this->permissions = new ArrayCollection(); 
    } 
} 

/** 
* @ORM\Entity 
*/ 
class Group 
{ 
    /** 
    * Many-To-Many, Unidirectional 
    * 
    * @var ArrayCollection $permissions 
    * 
    * @ORM\ManyToMany(targetEntity="Permission") 
    * @ORM\JoinTable(name="group_has_permission", 
    *  joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $permissions; 

    public function __construct() 
    { 
    $this->permissions = new ArrayCollection(); 
    } 
} 

/** 
* @ORM\Entity 
*/ 
class Permission {} 

यदि आपके पास हैं यहां क्या हो रहा है के बारे में प्रश्न, मुझे बताएं।

अब, अपने दूसरे उदाहरण के लिए

<?php 

namespace Your\Bundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
*/ 
class Ticket 
{ 
    /** 
    * Many-To-One, Unidirectional 
    * 
    * @var Category 
    * 
    * @ORM\ManyToOne(targetEntity="Category") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    protected $category; 

    /** 
    * Many-To-Many, Unidirectional 
    * 
    * @var ArrayCollection $permissions 
    * 
    * @ORM\ManyToMany(targetEntity="Tag") 
    * @ORM\JoinTable(name="tickt_has_tag", 
    *  joinColumns={@ORM\JoinColumn(name="ticket_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $tags; 

    /** 
    * One-To-Many, Bidirectional 
    * 
    * @var ArrayCollection $comments 
    * 
    * @ORM\OneToMany(targetEntity="Comment", mappedBy="ticket") 
    */ 
    protected $comments; 

    public function __construct() 
    { 
    $this->tags = new ArrayCollection(); 
    $this->comments = new ArrayCollection(); 
    } 
} 

/** 
* @ORM\Entity 
*/ 
class Comment 
{ 
    /** 
    * Many-To-One, Bidirectional 
    * 
    * @var Ticket $ticket 
    * 
    * @ORM\ManyToOne(targetEntity="Ticket") 
    * @ORM\JoinColumn(name="ticket_id", referencedColumnName="id") 
    */ 
    protected $ticket=null; 
} 

/** 
* @ORM\Entity 
*/ 
class Tag {} 

/** 
* @ORM\Entity 
*/ 
class Category {} 

पहले की तरह, मुझे पता है अगर आप इस में से किसी के बारे में बताया चाहते हैं।

पीएस इनमें से कोई भी वास्तव में परीक्षण नहीं किया गया था, मैं बस अपने आईडीई में तेजी से इसे टक्कर लगी। एक टाइपो या दो हो सकता है;)

+0

क्यों inverseJoin कॉलम? – vinnylinux

+0

इसके अलावा, अलग-अलग टेबल नाम क्यों?और अनुमति_आईडी घोषित नहीं किया जाना चाहिए? – vinnylinux

+1

@ विन्निलिनक्स - मुझे पूरी तरह से आपके प्रश्न नहीं मिलते हैं। inverseJoinColumns बस आप एक अनौपचारिक कई से अधिक रिश्तों की घोषणा कैसे करते हैं - जवाब देने के लिए "क्यों" नहीं है - यह ठीक है कि यह कैसे किया जाता है। और मुझे नहीं लगता कि आपका दूसरा प्रश्न बिल्कुल क्या है। –

4

इस प्रयास करें:

Class User { 
/** 
    * @ORM\OneToMany(targetEntity="path\to\group", mappedBy="user", cascade={"persist", "remove"}) 
    */ 
    private $group; 

आप User और Group के बीच कई संबंध के लिए एक होगा .. targetEntity एंटिटी को रास्ता है कि आप के साथ एक रिश्ता है चाहता हूँ, mappedBy से चर रहा है Group इकाई। cascadeUserGroup को जोड़ सकते हैं और Group

कक्षा समूह {से निकाल सकते हैं

/** 
* @ORM\ManyToOne(targetEntity="path\to\user, inversedBy="group") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

इस रिश्ते की आरक्षित पक्ष है .. targetEntity पथ वापस मूल इकाई है, जिसमें User है के लिए होनी चाहिए मतलब है ये मामला। inversedByUser इकाई से चर है। JoinColumn सिर्फ डॉक्टर को बता रहा है कि इसमें क्या शामिल होना है, यह स्वचालित रूप से किया जाता है यदि आप इसे स्वयं सेट नहीं करते हैं।

+0

क्या आप समझा सकते हैं? – MDrollette

संबंधित मुद्दे