2017-09-04 115 views
0

顾问实体索引外键优化查询

<?php   
     namespace Entity; 
     /** 
     * @Entity 
     * @Table(name="consultant") 
     */ 
     class Consultant{  

      /** 
      * @Id 
      * @Column(type="integer", nullable=false) 
      * @GeneratedValue(strategy="AUTO") 
      */ 
      protected $id; 
      /** 
     * Get id 
     * 
     * @return integer 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 
     } 

Paitent实体

 <?php 

     namespace Entity; 
     /** 
     * @Entity 
     * @Table(name="patient") 
     */ 
     class Patient{ 


      /** 
      * @Id 
      * @Column(type="integer", nullable=false) 
      * @GeneratedValue(strategy="AUTO") 
      */ 
      protected $id; 
      /** 
     * Many Patients belogns to a single consultant. 
     * @ManyToOne(targetEntity="consultant") 
     * @JoinColumn(name="consultant_id", referencedColumnName="id", nullable=false) 
     */ 
     private $consultant; 
     /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
    /** 
    * Set consultant 
    * 
    * @param \Entity\consultant $consultant 
    * 
    * @return Patient 
    */ 
    public function setConsultant(\Entity\consultant $consultant) 
    { 
     $this->consultant = $consultant; 
     $consultant->addPatient($this); 
     return $this; 
    } 

    /** 
    * Get consultant 
    * 
    * @return \Entity\consultant 
    */ 
    public function getConsultant() 
    { 
     return $this->consultant; 
    } 
} 

查询生成器

$qb = $this->em->createQueryBuilder(); 
     $qb 
     ->select('p') 
     ->from('Entity\Consultant', 'c') 
     ->innerJoin('Entity\Patient', 'p', 'c.id = p.consultant_id') 
     ->where('c.id = ?1')    
     ->setParameter(1, 1)   
     $query = $qb->getQuery(); 
     $results = $query->getResult(); 

问题

我需要属于一个特定的顾问所有患者和我目前使用的学说2.上述查询生成器查询要优化上面的查询我一定要指数consultant_id病人实体?如果是的话,如何在教条2中做到这一点?还有其他任何优化技术也受到欢迎。

回答

0

Doctrine自动在外键字段上创建一个索引,因此不需要手动添加一个索引。为了得到所有属于顾问的患者,如问题所示不需要连接,但可以使用下面提到的更简单的查询。

新建查询

$qb = $this->em->createQueryBuilder(); 
     $qb 
      ->select('p.name') 
      ->from('Entity\Patient', 'p')   
      ->where('p.consultant = ?1') 
      ->setParameter(1, 1);