我有几个实体有一些关联。他们现在装得很好。所以我基本上有一个与地址实体相关的客户实体。我还有一个与客户有关的收据交易。
当我检索一小组客户时,我想要检索他们的相关收据,但这个集合很大。我只想要过去两周的收据。
我认为我可以使用自定义存储库,然后使用像customer-> getRecentReceipts()这样的函数,但这不起作用,因为客户实体不知道存储库。通过在这个论坛上阅读,人们似乎说不要以这种方式使用存储库。我应该如何构建限制我的收据实体的加载。我试图避免加载所有然后用PHP例程对它们进行排序。
答案 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中完成任务的完美有效方式。
您可以通过传递一系列客户轻松修改此项以获得许多客户收据。