2015-10-02 3 views
1

У меня есть несколько объектов, которые имеют несколько ассоциаций. Сейчас они загружаются. Таким образом, у меня в основном есть объект клиента, относящийся к объекту адреса. У меня также есть транзакция квитанции, относящаяся к клиенту.Связанные объекты и их репозиторий - выборочно загружающие объекты

Когда я получаю небольшой набор клиентов, я хочу получить их связанные квитанции, но этот набор огромен. Мне нужны только квитанции за последние 2 недели.

Я думал, что могу использовать пользовательский репозиторий, а затем использовать функцию customer-> getRecentReceipts(), но это не работает, поскольку пользовательский объект не знает о репозитории. И из чтения на этом форуме люди, кажется, говорят, что не используют репозиторий таким образом. Как мне структурировать вещи, чтобы ограничить загрузку моих объектов получения. Я пытаюсь не загружать все, а затем сортировать их с помощью php-процедуры.

ответ

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() будет возвращать только квитанции, которые мы указали по дате.

Нет, вы не можете назвать это из своего объекта Customer, но нет причин, по которым вы не можете вызвать его в методе контроллера. Это совершенно правильный способ добиться успеха в Symfony.

Вы можете легко изменить это, чтобы получить много клиентских квитанций, передав множество клиентов.

1

Я думаю, вы забыли связать свой репозиторий с сущностью.

Exemple:

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

use Doctrine\ORM\Mapping as ORM; 

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

что, когда вы можете использовать свои хранилища функций

Смежные вопросы