2016-04-27 4 views
0

Ich habe dieses Szenario: eine Entität Person, ein Repository für Person und einen ausgewählten Formulartyp.Wie kann ich die Methode der Entität in einem Repository-Abfrage-Generator aufrufen

Ich sollte in meiner ausgewählten Form nur aktive Person nehmen.

In der Entität gibt es eine öffentliche Methode "isActive", die überprüft, ob eine Person die Berechtigung zum Zugriff in meinem privaten Bereich hat. Diese Methode gibt true oder false zurück und ist keine Spalte in der db-Tabelle, sie wird berechnet.

Ich muss auf dieses Flag von meinem Querybuilder im Personenrepository zugreifen. Ist es möglich? unter dem Code meines Querybuilders im Repository.

public function getQueryBuilderForEventRegistration() 
{ 
    $queryBuilder = $this->createQueryBuilder('e')->orderBy('e.surname', 'asc')->addOrderBy('e.name', 'asc'); 

    return $queryBuilder; 
} 

und die öffentliche Methode in der Entität Person tha ti Zugriff haben:

public function getIsActive() 
{ 
    if (empty($this->getUser())) 
    { 
     return false; 
    } 

    if (!$this->getUser()->isEnabled()) 
    { 
     return false; 
    } 

    /* @var $service \Siderweb\SubscriptionBundle\Entity\UserService */ 
    foreach ($this->getUser()->getServices() as $service) 
    { 
     if (!$service->getIsExpired()) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

und mein Typ:

$builder->add('personExist', 'entity', array(
      'class' => 'MyAppUserBundle:Person', 
      'property' => 'name', 
      'required' => false, 
      'multiple' => false, 
      'mapped' => false, 
      'empty_value' => '-- New person --', 
      'query_builder' => function(PersonRepository $repo) use ($options) { 
       return $repo->getQueryBuilderForEventRegistration(); 
      } 
     )) 

wie vorgeschlagen, dass ich mein Repository wie folgt bearbeiten:

public function getQueryBuilderForEventRegistration(Company $company = null, Event $event = null, $emailFilter = null) 
{ 
    $queryBuilder = $this->createQueryBuilder('e')->orderBy('e.surname', 'asc')->addOrderBy('e.name', 'asc'); 

    $people = $queryBuilder->getQuery()->execute(); 
    $peopleToShow = array(); 

    foreach ($people as $person) 
    { 
     if ($person->getIsActive()) 
     { 
      array_push($peopleToShow, $person); 
     } 
    } 

    return $peopleToShow; 
} 

aber jetzt ich nicht k jetzt, wie man dieses Array in meine typeForm legt. Irgendeine Idee?

+0

Ich weiß nicht, ob es möglich ist, aber Sie können dies in Ihrem Controller tun, und fügen Sie den Parameter zu Ihrer Funktion hinzu: getQueryBuilderForEventRegistration ($ param) und tun, was Sie wollen mit param – Letsrocks

+0

Wie komplex ist Ihre benutzerdefinierte Funktion? – goto

Antwort

0

Okay, so können Sie Entity-Methode nicht auf den Abfrage-Generator aufrufen, aber Sie können auf die Abfrage Ergebnisse. Doctrine hydratisiert Ihre Entitätsobjekte mit den Daten, die von der Datenbank zurückgegeben werden.

Sobald Sie Ihre Ergebnisse haben, können Sie die Methode isActive() für die hydratisierten Einheiten aufrufen.

Die Art und Weise, dass Sie versuchen, dies zu implementieren (die Query Builder für das Formular bekommen), müssen Sie eine isActive Spalte in Ihrer Datenbank-Tabelle und fügen Sie eine ‚wo‘ Klausel wie folgt:

public function getQueryBuilderForEventRegistration() 
{ 
    $queryBuilder = $this->createQueryBuilder('e') 
     ->where('e.isActive', true) 
     ->orderBy('e.surname', 'asc') 
     ->addOrderBy('e.name', 'asc'); 

    return $queryBuilder; 
} 
+0

Vielen Dank für Ihre Antwort, aber sobald ich das Ergebnis von meinem Abfrage-Generator habe, wie kann ich das Ergebnis gefilterten Array im Typ Builder aufrufen? –

+0

In einem Formular können Sie nichts mit den Ergebnissen tun, abgesehen von dem Erstellen der Abfrage, die Sie benötigen. Sobald Sie Ihr QueryBuilder-Objekt haben, können Sie $ queryBuilder-> getResult() aufrufen, das ein Array von zurückgegebenen Objekten zurückgibt. Sie können sie dann durchlaufen und die Methode -> isActive() für das Objekt aufrufen. – LMS94

+0

Aber wenn mein QueryBuilder mir ein Array zurückgibt, wie kann ich es in meine Typformstruktur einfügen? –

0

Es ist nicht möglich, eine benutzerdefinierte PHP-Methode eine SQL-Abfrage aufzurufen, daher lässt Doctrines QueryBuilder das nicht zu. Sie müssen entweder isActive als Datenbankfeld (oder benutzerdefinierte Methode) haben oder Sie getIsActive Methode mit QueryBuilder-Bedingungen reproduzieren.

Verwandte Themen