symfony2 doctrine2:将选择元素添加到现有实体

symfony2 doctrine2: addselect elements to existing entity

我正在使用 Symfony2 和 Doctrine2。

在很多情况下,当我有一个实体时,我需要遍历它的关联实体。当然它经常触发新的查询并且性能不是很好。

将其他实体 addselect 到现有实体是否有最佳实践?

想想你在 symfony 中使用参数转换器的时候。它只会让你成为实体。如果我检索订单并想遍历其 orderLines 怎么办?我需要建立一个新的查询和 retrieve->leftjoin('order.orderlines', 'l')->addselect('l')->where('order = $order') 吗?

这种情况下的最佳做法是使用显式加入关联实体的自定义存储库方法。这样 Doctrine 就不必在循环的每次迭代中单独查询。您也可以在 ParamConverter 中使用此 custom repository method

自定义存储库方法:

这是一个控制器示例:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/blog/{id}")
 * @ParamConverter("post", class="MyBundle:Order", 
    options={"repository_method" = "findOrderWithLineItems"})
 */
public function showAction(Order $order)
{
}

然后在实体上指定自定义存储库:

namespace MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="MyBundle\Entity\OrderRepository")
 */
class Order
{
}

然后是您的自定义存储库:

namespace MyBundle\Entity;

use Doctrine\ORM\EntityRepository;

class OrderRepository extends EntityRepository
{
    public function findOrderWithLineItems($id)
    {
        return $this->createQueryBuilder('o')
            ->join('o.orderLines', 'ol')
            ->where('o.id = :id')
            ->setParameter('id', $id)
            ->getQuery()
            ->getResult()
        ;
    }
}

始终通过 Eager Fetching 加入:

如果您希望 始终 获取关联的实体(始终加入 table),即使在基础实体上执行简单的 select ,您可以在关联实体上指定一个急切连接:

class Order
{
    /**
     * @ManyToOne(targetEntity="OrderLines", fetch="EAGER")
     */
    private $orderLines;
}