2016-01-19 26 views
6

का उपयोग करके कई से अधिक रिश्ते पर आंतरिक कैसे काम करता है मैंने हाल ही में ManyToMany संबंधों में शामिल होने के साथ एक समस्या का समाधान किया, समाधान इस answer के समान था और यह सोच रहा था कि यह कैसे काम करता है। मान लीजिए कि मैं groups और team के बीच एक सरल ManyToMany संबंध है, वहाँ एक groups_team टेबल कि स्वचालित रूप से क्रम में यहांडॉक्टरेट और सिम्फनी 2

समूहों इकाई

/** 
* Groups 
* 
* @ORM\Table(name="groups") 
* @ORM\Entity(repositoryClass="AppBundle\Model\Repository\GroupsRepository") 
*/ 
class Groups { 

    /** 
    * @ORM\ManyToMany(targetEntity="Team", inversedBy="group") 
    */ 
    protected $team; 

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

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="groupname", type="string", length=255) 
    */ 
    private $groupname; 
    //obligatory getters and setters :) 

टीम इकाई

/** 
* Team 
* 
* @ORM\Table(name="team") 
* @ORM\Entity(repositoryClass="AppBundle\Model\Repository\TeamRepository") 
*/ 
class Team { 

    /** 
    * @ORM\ManyToMany(targetEntity="Groups", mappedBy="team") 
    */ 
    protected $group; 

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

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="teamname", type="string", length=255) 
    */ 
    private $team; 
    //[setters and getters here] 

बनाया जाएगा होगा एक समूह में सभी टीमों को प्राप्त करने के लिए मुझे groups_team table.I से पूछताछ करनी होगी। मैंने केवल mysql में तालिका की पूछताछ की होगी लेकिन अंदर सिम्फोनी मैं कैसे innerJoin काम कर रहा है इस

 $groups = $em->getRepository("AppBundle\Model\Entity\Groups")->findBy(array('tournament' => $tournament->getId())); 

     //get all teams with group id in groups_team table 
     foreach ($groups as $group) { 
      $teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")->createQueryBuilder('o') 
        ->innerJoin('o.group', 't') 
        ->where('t.id = :group_id') 
        ->setParameter('group_id', $group->getId()) 
        ->getQuery()->getResult(); 
      echo "</b>".$group->getGroupname()."</b></br>"; 
      foreach ($teamsingroup as $teamingroup) { 
       echo $teamingroup->getTeam()."</br>"; 
      } 
     } 

किसी ने मुझे बता सकते हैं क्या करना है और इस के पीछे की अवधारणा, इस बारे में जानने के शायद कुछ प्रलेखन क्या है। सिम्फनी और सिद्धांत के साथ ऐसा करने का बेहतर तरीका है।

उत्तर

5

ManyToMany 2 के बीच संस्थाओं का उपयोग करते हुए एक तिहाई तालिका आम तौर पर संबंध के इस प्रकार में एक जंक्शन तालिका के रूप में कहा जाता है जब आप एक DQL (सिद्धांत क्वेरी) का निर्माण शामिल है सिद्धांत स्वचालित रूप से संबंध की प्रकृति तुम इतनी टिप्पणी के रूप में परिभाषित किया है पर निर्भर करता है जंक्शन तालिका संयोजन आपकी क्वेरी पर विचार

$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team") 
        ->createQueryBuilder('o') 
        ->innerJoin('o.group', 't') 

आप innerJoin('o.group') हिस्सा o में Group संस्था के साथ Team इकाई में शामिल हो रहे टीम इकाई के लिए अन्य नाम है और o.groupTeamgroup के रूप में वर्णित निकाय में परिभाषित संपत्ति को दर्शाता है।

/** 
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team") 
*/ 
protected $group; 

जो एक ManyToMany एनोटेशन संबंध सिद्धांत के इस प्रकार के लिए परिभाषित है जंक्शन तालिका के साथ पहली बार अपनी टीम तालिका संयोजन और उसके बाद समूह तालिका के साथ अपने जंक्शन तालिका जुड़ जाता है और उसके एवज में एसक्यूएल

SELECT t.* 
FROM teams t 
INNER JOIN junction_table jt ON(t.id = jt.team_id) 
INNER JOIN groups g ON(g.id = jt.group_id) 
WHERE g.id = @group_id 
की तरह कुछ हो जाएगा

प्रत्येक समूह के लिए टीम प्राप्त करने के आपके तरीके से संबंधित एक और चीज आप createQueryBuilder भाग को छोड़कर createQueryBuilder भाग को छोड़कर अपने कोड को कम कर सकते हैं, एक बार जब आप टीम की संपत्ति को ArrayCollection i परिभाषित करते हैं।प्रत्येक समूह ऑब्जेक्ट पर ई $this->team = new ArrayCollection(); आपको नीचे दिए गए कोड के समान समूह ऑब्जेक्ट पर getTeam() फ़ंक्शन पर कॉल करके उस विशेष समूह से जुड़े टीमों का संग्रह प्राप्त होगा।

foreach ($groups as $group) { 
    $teamsingroup = $group->getTeam(); 
    echo "</b>".$group->getGroupname()."</b></br>"; 
    foreach ($teamsingroup as $teamingroup) { 
     echo $teamingroup->getTeam()."</br>"; 
    } 
} 
+1

धन्यवाद, यह मेरा कोड कम कर दिया, और यह मुझे अधिक सुव्यवस्थित कोड सोचने के लिए मेरे रास्ते पर शुरू किया। इसने मेरे प्रश्न का उत्तर 100% दिया। एसओ एक महान मंच है। +1 –

0

मुझे लगता है कि यह मुख्य कॉलम परिभाषित इकाई वर्ग का उपयोग करके INNER जॉइन के साथ सचमुच चयन कथन है जिसे मैप किया गया है या उलटा हुआ है। आपके पास सिद्धांत लॉग का नज़र क्यों नहीं है और देखें कि देशी एसक्यूएल क्या बना है?

How to get Doctrine to log queries in Symfony2 (stackoverflow)

http://vvv.tobiassjosten.net/symfony/logging-doctrine-queries-in-symfony2/ (कुछ कोड उदाहरण)

मैं इस के पीछे अपने उपयोगकर्ता कहानी पता नहीं है, लेकिन मैं यह भी सुना है कि यह कई के बजाय कई रिश्ते के लिए एक का उपयोग करने की सिफारिश की है कई लोगों तक, जब तक ऐसा करने का कोई मजबूत कारण न हो, क्योंकि ज्यादातर मामलों को मॉडलों पर पुनर्विचार करके कई लोगों द्वारा संभाला जा सकता है।

+0

हाय उत्तर के लिए धन्यवाद, हां मैंने 'कई टोनी 'के स्थान पर' वनटोन '-' ManyToOne' पर विचार किया था। लेकिन, एक बड़ा लेकिन, यह निश्चित रूप से वही नहीं है, आपके पास 'OneToMany - ManyToOne'' के लिए 'एक' पक्ष है जिसका अर्थ है कि हमें रिकॉर्ड डालने के लिए एक लूप का उपयोग करना होगा, और यह केवल गन्दा नहीं है, बल्कि इसमें एक भी शामिल है बहुत सी कस्टम कोड (संकेत: इसमें एक सरल सीआरयूडी ऑपरेशन करने के लिए 'क्लोन' या 'डिटेच() '_shivers! _) का उपयोग करना शामिल है। और इसलिए अच्छा ओएल 'ManyToMany'। –