如何在加入实体关系时防止冗余查找?

时间:2012-11-27 12:59:57

标签: php symfony doctrine

我正在快速使用Symfony 2和Doctrine,并且正在执行不必要的数据库查找次数,以便与已连接的实体进行水合。

使用子对象执行联接查询后,子进程会自动从数据库中提取其他映射。虽然我没有尝试访问它的任何属性,但它正在这样做。就好像在find查询中访问它们一样。

我的示例如下所示 - 有一些名为PersonBuilding的实体都加入了一个名为Place的实体:

class Person {
    /**
     * Where this person lives
     * @var Place $Home
     * 
     * @ORM\OneToOne(targetEntity="Place", cascade={"persist"}, inversedBy="Resident" )
     * @ORM\JoinColumn(name="place_id", referencedColumnName="id")
     */
    private $Home;
}

class Building {

    /**
     * Where this building stands
     * @var Place $Site
     * 
     * @ORM\OneToOne(targetEntity="Place", cascade={"persist"}, inversedBy="Landmark" )
     * @ORM\JoinColumn(name="place_id", referencedColumnName="id")
     */
    private $Site;
}

class Place {
    /**
     * Reverse mapping
     * @var Person $Resident
     * 
     * @ORM\OneToOne(targetEntity="Person", mappedBy="Home")
     */   
    private $Resident;

    /**
     * Reverse mapping
     * @var Building $Landmark
     * 
     * @ORM\OneToOne(targetEntity="Building", mappedBy="Site")
     */   
    private $Landmark;
}

我的人员存储库连接如下所示:

/**
 * @override
 * @return Person
 */
public function find( $id ){
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT p, h
            FROM MyBundle:Person p
            JOIN p.Home h
            WHERE p.id = :id'
        )->setParameter('id', $id);
    return $query->getSingleResult();
}

如何在find操作期间单独阻止Place获取其建筑物关系?有什么东西我可以传递到Query实例来阻止这个吗?

1 个答案:

答案 0 :(得分:-1)

为您的地图添加fetch选项。

像这样:

  

课程地点{

/**
 * Reverse mapping
 * @var Person
 * 
 * @ORM\OneToOne(targetEntity="Person", mappedBy="Home", fetch="EXTRA_LAZY")
 */   
private $Resident; 
     

}