2013-05-24 6 views
5

मैं Syctfony2 का उपयोग Doctrine2 के साथ करता हूं। वहाँ निम्नलिखित संस्थाओं हैं: कह रही है किDoctrine2 findBy() तालिका तालिका में शामिल हो गया

$repository = $this->getDoctrine()->getRepository('AcmeConsysBundle:Person'); 
    $people = $repository->findBy(
      array(), 
      // here I want to order by the company name 
      // that is taken from the Company entity 
      array('company.name' => 'asc') 
    ); 

निश्चित रूप से यह कोड काम नहीं करता,:

/** 
* Person 
* 
* @ORM\Entity(repositoryClass="Acme\Bundle\ConsysBundle\Entity\PersonRepository") 
* @ORM\HasLifecycleCallbacks 
* @ORM\Table(name="person") 
*/ 
class Person 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * 
    * @ORM\ManyToOne(targetEntity="Company", inversedBy="persons", fetch="EAGER") 
    * @ORM\JoinColumn(name="company_id", referencedColumnName="id", onDelete="SET NULL") 
    */ 
    private $company; 

} 

और

/** 
* Company 
* 
* @ORM\Entity(repositoryClass="Acme\Bundle\ConsysBundle\Entity\CompanyRepository") 
* @ORM\HasLifecycleCallbacks 
* @ORM\Table(name="company") 
*/ 
class Company 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

अब मेरी नियंत्रक में मैं निम्नलिखित कार्य करने होंगे "company.name" अपरिचित है। लेकिन फिर मैं उस कॉलम से कैसे आदेश दे सकता हूं? क्या FindBy() का उपयोग करना संभव है? आप कंपनी द्वारा व्यक्ति संस्थाओं के किसी वर्तमान संग्रह सॉर्ट करने के लिए चाहते हैं

+1

मुझे लगता है कि यह findby के साथ संभव नहीं है, लेकिन आप कर सकते हैं एक कस्टम्यूरी – 0x1gene

+0

कृपया मेरे उत्तर की समीक्षा करें और टिप्पणी करें अगर कुछ अस्पष्ट है - अन्यथा इसे स्वीकार करने के लिए कृपया :) – nifr

उत्तर

15

अपने PersonRepository

public function findAllOrderByCompany() 
{ 
    return $this->createQueryBuilder('p') 
     ->leftJoin('p.company','c') 
     ->orderBy('c.name', 'asc') 
     ->getQuery() 
     ->getResult(); 
} 

में जोड़ना :: getName

$iterator = $collection->getIterator(); 
$iterator->uasort(function ($a, $b) { 
    return ($a->getCompany()->getName() < $b->getCompany()->getName()) ? -1 : 1; 
}); 
$collection = new ArrayCollection(iterator_to_array($iterator)); 
+0

ठीक है, मैंने अभी स्रोतों की जांच की है और, आप सही हैं, मुझे क्वेरी बिल्डर का उपयोग करने की आवश्यकता होगी। दूसरा विकल्प वास्तव में मेरे लिए एक समाधान नहीं है, क्योंकि यह बड़ी डेटा मात्राओं पर ओवरहेड होगा। –

+0

ने इसे लोगों को इस तरह अपने संग्रह को फिर से क्रमबद्ध करने के बारे में जानने के लिए शामिल किया :) – nifr

+0

मैंने परीक्षण के बिना अपना कोड स्वीकार कर लिया। और हालांकि विचार ठीक है, लेकिन कार्यान्वयन नहीं है। createQueryBuilder() पैरामीटर के रूप में सरणी स्वीकार नहीं करता है। क्या आप लोगों को बाद में भ्रमित न करने के लिए कृपया अपना उत्तर ठीक कर सकते हैं? –

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