2012-04-16 8 views
7

मैं सिद्धांत के साथ सिम्फनी 2 का उपयोग कर रहा हूं, और मेरे पास कई संस्थाओं में कई संस्थाएं शामिल हैं। मान लें कि मेरे पास दो इकाइयां हैं: उपयोगकर्ता और समूह, और डीबी पर संबंधित टेबल उपयोगकर्ता, समूह और उपयोगकर्ता_ समूह हैं।कई लोगों के लिए डीक्यूएल और

मैं शीर्ष 10 सबसे अधिक आबादी वाले समूह को डीक्यूएल में प्राप्त करना चाहता हूं, लेकिन मुझे शामिल तालिका (users_groups) पर क्वेरी करने के लिए वाक्यविन्यास नहीं पता है। मैंने पहले से ही डॉक्टर मैनुअल पर देखा लेकिन मुझे समाधान नहीं मिला, मुझे लगता है कि मुझे अभी भी डीक्यूएल के बारे में जानने के लिए बहुत कुछ है।

सादा एसक्यूएल में हो सकता है कि:

select distinct group_id, count(*) as cnt from users_groups group by group_id order by cnt desc limit 10 

आप कृपया मेरी मदद कर सकते मुझे इस DQL को अनुवाद करने के लिए?

अद्यतन (वर्ग):

$dql = "SELECT g.id, count(u.id) as cnt FROM Entity\Group g " . 
    "JOIN g.users u GROUP BY g.id ORDER BY cnt DESC LIMIT 10;"; 
$query = $em->createQuery($dql); 
$popularGroups = $query->getArrayResult(); 

अद्यतन:

/** 
* Entity\E_User 
* 
* @ORM\Table(name="users") 
* @ORM\Entity 
*/ 
class E_User 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="E_Group", cascade={"persist"}) 
    * @ORM\JoinTable(name="users_groups", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="cascade")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id", onDelete="cascade")} 
    *) 
    */ 

    protected $groups; 

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

    /** 
    * @var string $name 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /* ... other attributes & getters and setters ...*/ 
} 


/** 
* Entity\E_Group 
* 
* @ORM\Table(name="groups") 
* @ORM\Entity 
*/ 
class E_Group 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $name 
    * 
    * @ORM\Column(name="text", type="string", length=255) 
    */ 
    private $name; 

    /* ... other attributes & getters and setters ...*/ 
} 

उत्तर

6

यह वास्तविक कक्षाएं देखे बिना आसान नहीं है, लेकिन आप का अनुमान लगाकर एक कई-से-अनेक द्विदिश रिश्ता है:

आप एक द्विपक्षीय संबंध का उपयोग करना है, तो आप qu

$dql = "SELECT g.id, count(u.id) as cnt FROM Entity\User u " . 
    "JOIN u.groups g GROUP BY g.id ORDER BY cnt DESC LIMIT 10;"; 
+0

धन्यवाद, समस्या यह है कि समूह इकाई के पास उपयोगकर्ताओं नामक एक संगठन नहीं है। इसलिए मुझे अपवाद मिलता है: [सेमेन्टिकल एरर] लाइन 0, जी ग्रुप द्वारा ग्रुप के पास कॉल 72: त्रुटि: कक्षा इकाई \ E_Group के पास उपयोगकर्ताओं का नाम नहीं है। मैंने वास्तविक वर्गों के साथ प्रश्न अद्यतन किया। क्या मैं बिडरेक्शनल को कई से अधिक रिश्तों को बनाने के लिए E_Group इकाई में $ उपयोगकर्ता विशेषता जोड़ूं? –

+0

बहुत धन्यवाद। मैं वैसे भी एक द्विपक्षीय संबंध के साथ समाप्त हुआ। यह समझने के लिए कि यह कैसे काम करता है, यह सिर्फ एक डमी क्वेरी थी। एक बार फिर धन्यवाद –

0

जो लोग सिद्धांत के QueryBuilder बजाय का उपयोग कर DQL सीधे इस समाधान लेने के साथ क्वेरी का निर्माण करना चाहते के लिए: दूसरी तरह के आसपास ery।

कृपया ध्यान दें कि मेरी समस्या शीर्ष उपयोगकर्ता समूहों को नहीं प्राप्त करना था, लेकिन तकनीकी रूप से समस्या मेरे जैसा ही है। मैं पदों (जैसे आलेख/ब्लॉग पोस्ट) और टैग जो पोस्ट में जोड़े जाते हैं, के साथ काम करते हैं। मुझे संबंधित पदों की एक सूची निर्धारित करने की आवश्यकता थी (उसी टैग द्वारा पहचाना गया)। उस सूची को प्रासंगिकता द्वारा क्रमबद्ध किया जाना था (जितना अधिक टैग उतना ही प्रासंगिक होगा जितना अधिक प्रासंगिक है)।

/** 
* Finds all related posts sorted by relavance 
* (from most important to least important) using 
* the tags of the given post entity. 
* 
* @param Post $post 
* 
* @return POST[] 
*/ 
public function findRelatedPosts(Post $post) { 
    // build query 
    $q = $this->createQueryBuilder('p') 
     ->addSelect('count(t.id) as relevance') 
     ->innerJoin('p.tags', 't') 
     ->where('t.id IN (:tags)') 
     ->setParameter('tags', $post->getTags()) 
     ->andWhere('p.id != :post') 
     ->setParameter('post', $post->getId()) 
     ->addGroupBy('p.id') 
     ->addOrderBy('relevance', 'DESC') 
     ->getQuery(); 

    // execute query and retrieve database result 
    $r = $q->execute(); 

    // result contains arrays, each array contains 
    // the actual post and the relevance value 
    // --> let's extract the post entities and 
    // forget about the relevance, because the 
    // posts are already sorted by relevance 
    $r = array_map(function ($entry) { 
     // first index is the post, second one 
     // is the relevance, just return the post 
     return reset($entry); 
    }, $r); 

    // array of posts 
    return $r; 
} 

आप समाधान के लिए आप @Tom Imrei धन्यवाद:

यह मेरा PostRepository वर्ग की विधि है। इसके अलावा उत्तर #26549597 बहुत उपयोगी था।