2013-05-24 17 views
5

Symfony2'yi Doctrine2 ile kullanıyorum. Aşağıdaki kişiler vardır: söyleyerekDoctrine2 findBy() harfe bağlı tablo alanı

$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') 
    ); 

elbette bu kod çalışmaz:

/** 
* 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; 

} 

ve

/** 
* 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; 
} 

Şimdi benim denetleyicisi aşağıdakileri yapmanız gerekir "company.name" tanınmıyor. Ama sonra o sütundan nasıl sipariş verebilirim? FindBy() kullanarak yapmak mümkün mü? Eğer Şirket tarafından Kişi varlıkların mevcut bir koleksiyonu sıralamak isterseniz

+1

Ben findby mümkün olmadığını düşünüyorum, ancak yapabilir sizin PersonRepository

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

bu eklemek Bir özel bir – 0x1gene

+0

lütfen cevapımı gözden geçirin ve herhangi bir şey belirsizse yorum yapın - aksi halde kabul edin :) – nifr

cevap

15

:: 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

Tamam, kaynakları kontrol ettim ve haklısınız, sorgu oluşturucuyu kullanmam gerekecek. İkinci seçenek gerçekten benim için bir çözüm değildir, çünkü büyük veri miktarlarında ek yük olacaktır. –

+0

sadece koleksiyonlarını bu şekilde yeniden sıralamak mümkün olduğunu bildirmek için sadece dahil :) – nifr

+0

Test olmadan kodunuzu kabul ettim. Ve fikir tamam, ama uygulama değil. createQueryBuilder(), diziyi bir parametre olarak kabul etmiyor. İnsanları daha sonra karıştırmamak için lütfen cevabınızı düzeltebilir misiniz? –

İlgili konular