2013-05-24 9 views
5

私はDoctrine2でSymfony2を使用します。次のエンティティがあります。Doctrine2 findBy()の結合テーブルフィールドの順

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

は今私のコントローラで私は、次の操作を行う必要があります

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

もちろんこのコードは動作しません、と言っ"company.name"は認識されません。しかし、その列でどのように注文できますか? findBy()の使用は可能ですか?

+1

を個人エンティティのexisitingコレクションをソートしたい場合、私はそれがfindbyでは不可能だと思いますが、あなたが作ることができ

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

あなたPersonRepositoryにこれを追加カスタムクエリー – 0x1gene

+0

不明な点がある場合は、私の答えとコメントを確認してください - それ以外の場合はpleaeを受け入れてください:) – nifr

答えて

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

Ok、私はソースをチェックしただけで、クエリービルダーを使用する必要があります。 2番目のオプションは、大きなデータ量のオーバーヘッドになるため、実際には私にとっては解決策ではありません。 –

+0

ちょうどそれが人々にこのようにコレクションを再ソートする可能性を知らせるためにそれを含んでいます:) – nifr

+0

私はテストなしであなたのコードを受け入れました。しかし、アイデアはOKですが、実装はそうではありません。 createQueryBuilder()は配列をパラメータとして受け入れません。後で人を混乱させないように答えを修正してください。コメントのために –

関連する問題