Related Entities and their Repository - 有选择地加载实体

Related Entities and their Repository - selectively loading entities

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

当我检索一小部分客户时,我想检索他们的相关收据,但那一组是巨大的。我只想要过去 2 周的收据。

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

创建存储库方法来执行此操作没有错。您没有直接与客户实体打交道以获得其收据。

我只是在 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() 只会 return 我们按日期指定的收据。

不,您不能从客户实体调用它,但没有理由不能在控制器方法中调用它。这是在 Symfony 中完成任务的完全有效的方法。

您可以轻松修改它,通过传递一组客户来获得许多客户收据。

我想你忘了 link 你在实体的存储库。

示例:

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

use Doctrine\ORM\Mapping as ORM;

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

那时您可以使用您的存储库功能