2013-03-17 14 views
18

Potrzebuję wartości z 2 różnych podmiotów. Nie wiem jak to zrobić. Próbowałem to do tej pory:Jak zdobyć zagraniczne repozytorium w moim repozytorium w Doctrine2/Symfony2?

<?php 

namespace Pond\GeolocBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

/** 
* PondLakeRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class PondLakeRepository extends EntityRepository 
{ 

    public function getSwimsAvailableById($id) 
    { 
     // get the nb of swims of a lake 
     $lake = $this->findOneById($id); 
     $swims = $lake->getSwims(); 

     $repository = $this->getDoctrine() 
          ->getManager() 
          ->getRepository('PondGeolocBundle:User_Lake'); 

     //get the nb of users in a lake 
     $qb = $this->_em->createQueryBuilder(); 
     $qb->select('count(a.id)'); 
     $qb->from('PondGeolocBundle:User_Lake', 'a'); 

     $nbOfUsers = $qb->getQuery()->getSingleScalarResult(); 

     // return the nb of swims available onthis lake 
     $avail = $swims - $nbOfUsers; 
     print_r ($avail); 
    } 

} 

Nie działa Proszę o pomoc. Dzięki

Odpowiedz

34

można uzyskać dostęp do EntityManager wywołując Doctrine\ORM\EntityRepository#getEntityManager():

$repository = $this 
    ->getEntityManager() 
    ->getRepository('PondGeolocBundle:User_Lake'); 
+3

Ponieważ nie określiłeś tego w swojej odpowiedzi (a OP nie wskazał tego w pytaniu), chcę ci powiedzieć, że ponieważ symfony2.2 '-> getEntityManager()' jest przestarzałe i z symfony3, to będzie usunięty. Użyj '-> getManager()' jeśli masz już symfony2.2 – DonCallisto

+7

@DonCallisto 'getEntityManager' jest metodą doktryną i nie ma nic wspólnego z Symfony2. Czy symfony2 automatycznie ustawia niestandardowe repozytoria? – Ocramius

+0

@Ocramius: w rzeczywistości masz rację. Wygląda więc na to, że uaktualniłem do symfony2.2 i doktryny (innej wersji) w tym samym czasie i pomyliłem to. Właściwie to komentarz został opublikowany w te same dni, w których zaczynam usuwać wszystkie przestarzałe połączenia i zrobiłem "wycinanie i wklejanie" :) – DonCallisto

0

Jeśli podoba Ci się bardziej do wstrzykiwania zależności, deklarują swoje repozytoria jako usługi, dzięki czemu można wstrzykiwać jeden go używać wewnątrz drugiej:

services.yml

services: 
    repository.user_lake: 
     class: Pond\GeolocBundle\Entity\UserLakeRepository 
     factory: [@doctrine, getRepository] 
     arguments: 
      - PondGeolocBundle:User_Lake 

    repository.pond_lake: 
     class: Pond\GeolocBundle\Entity\PondLakeRepository 
     factory: [@doctrine, getRepository] 
     arguments: 
      - PondGeolocBundle:PondLake 
     calls: 
      - [setUserLakeRepository, [@repository.user_lake]] 

w PondLakeRepository.php musisz mieć setter (setUserLakeRepository) do właściwości do przechowywania repozytorium (tj. $ userLakeRepository).

Powiązane problemy