Doctrine2 findBy()通过连接表字段排序 [英] Doctrine2 findBy() order by joined table field

查看:500
本文介绍了Doctrine2 findBy()通过连接表字段排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Symfony2与Doctrine2。有以下实体:

  / ** 
*人
*
* @ ORM\Entity(repositoryClass =Acme\Bundle\ConsysBundle\Entity\PersonRepository)
* @ ORM\HasLifecycleCallbacks
* @ ORM\Table(name =person)
* /
class Person
{
/ **
* @var整数
*
* @ 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;

}

  / ** 
*公司
*
* @ ORM\Entity(repositoryClass =Acme\Bundle\ConsysBundle\ Entity\CompanyRepository)
* @ ORM\HasLifecycleCallbacks
* @ ORM\Table(name =company)
* /
class公司
{
/ **
* @var整数
*
* @ 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(),
//这里我想按公司名称命令
//从公司实体取得
array('company.name'=>'asc')
);

这段代码当然不起作用,说company.name是无法识别的。但是那我怎么可以按这个列进行排序?是否可以使用findBy()?

解决方案

将此添加到您的PersonRepository

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

如果要通过Company :: getName对Person实体的现有集合进行排序

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


I use Symfony2 with Doctrine2. There are the following entities:

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

}

and

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

Now in my controller I need to do the following:

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

This code of course doesn't work, saying that "company.name" is unrecognized. But then how can I order by that column? Is it possible to do using findBy()?

解决方案

add this to your PersonRepository

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

If you want to sort an exisiting collection of Person entities by Company::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));

这篇关于Doctrine2 findBy()通过连接表字段排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆