相关实体及其存储库 - 有选择地加载实体

时间:2015-10-02 18:18:39

标签: symfony select doctrine repository entities

我有几个实体有一些关联。他们现在装得很好。所以我基本上有一个与地址实体相关的客户实体。我还有一个与客户有关的收据交易。

当我检索一小组客户时,我想要检索他们的相关收据,但这个集合很大。我只想要过去两周的收据。

我认为我可以使用自定义存储库,然后使用像customer-> getRecentReceipts()这样的函数,但这不起作用,因为客户实体不知道存储库。通过在这个论坛上阅读,人们似乎说不要以这种方式使用存储库。我应该如何构建限制我的收据实体的加载。我试图避免加载所有然后用PHP例程对它们进行排序。

2 个答案:

答案 0 :(得分:1)

我想你忘了在实体上链接你的存储库。

例:

// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
 */
class Product
{
    //...
}

那时你可以使用你的存储库函数

答案 1 :(得分:0)

使用存储库方法执行此操作没有任何问题。您没有直接与客户实体打交道以获取收据。

我只是在ReceiptRepository中创建一个简单的方法(语法可能不太对,我现在没有IDE方便)

getReceiptsForCustomerByDate(Customer $customer, \DateTime $createdAfter=null) {

    if (!$createdAfter instanceof \DateTime) {

        $createdAfter = new \DateTime('now -2 weeks');
    }

    $qb = $this->getEntityManager()->createQueryBuilder();

    return $qb->select('c, r')
        ->from('YourBundle:Customer', 'c')
        ->join('c.receipt', 'r')
        ->where($qb->expr()->eq('c', ':customer')
        ->andWhere($qb->expr()->gt('r.createdAt', ':createdAfter')
        ->setParameter('createdAfter', $createdAfter)
        ->setParameter('customer', $customer)
        ->getQuery()->getResult();

}

以上意味着您提取的客户实体具有相关收据。因为我们没有延迟加载收据,$ customer-> getReceipts()只会返回我们按日期指定的收据。

不,您无法从您的客户实体中调用此信息,但您无法在控制器方法中调用它。这是在Symfony中完成任务的完美有效方式。

您可以通过传递一系列客户轻松修改此项以获得许多客户收据。