2017-09-25 2 views
0

Ich habe ein querybuilder alle Einheiten zu bekommen, die ich in eine Anfrage will, aber am Ende macht es 26 SQL-Anfragen.symfony Querybuilder und Erhöhung der SQL-Anfragenummer

Gibt es eine Möglichkeit, es zu tun?

Vielen Dank für jede Antwort/Hilfe. Hier

ist die Query Builder:

$builder = $this->createQueryBuilder("message") 
    ->innerJoin("AppBundle:User", "user", "WITH", "message.sender = user.id") 
    ->innerJoin("AppBundle:Thread", "thread", "WITH", "message.thread = thread.id") 
    ->innerJoin("AppBundle:MessageMetadata", "messageMetadata", "WITH", "messageMetadata.message = message.id AND messageMetadata.participant != user.id") 
; 

$builder = $this->filterSoftdelete($builder, $user); 

if($filters != null) { 
    foreach ($filters as $key => $value) { 
     $builder->andWhere("(message.recipient = :id AND user.firstname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND user.lastname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND thread.subject LIKE '%". $value ."%')") 
      ->setParameter("id", $user->getId());; 
    } 
} else { 
    $builder->andWhere("message.recipient = :id or message.sender = :id") 
     ->setParameter("id", $user->getId()); 
} 

if($ordering != null) { 
    foreach ($ordering as $key => $value) { 
     if($key == "subject") { 
      $builder->addOrderBy("thread.subject", $value); 
     } else if($key == "createdAt") { 
      $builder->addOrderBy("message." . $key, $value); 
     } else { 
      $builder->addOrderBy("messageMetadata.isRead", "desc"); 
     } 
    } 
} else { 
    $builder->addOrderBy("messageMetadata.isRead", "desc"); 
} 

return $this->query($builder); 

Antwort

0

Ihr Erbauer sollte nur Feuer eine Anfrage. Aber vielleicht versuchen Sie, auf Attribut- oder verbundene Sammlungen zuzugreifen, die nicht abgerufen werden, und das Lazy-Laden kommt ins Spiel, wodurch viele unerwünschte Anfragen erzeugt werden.

Regel in der Steuerung, wenn Sie Ihre Einheiten mit Ihrem Erbauer holen:

$entities = $em->getRepository('myrepo')->myCustomQuery($myparams...); 

Dazu Schleife durch Ihre Entitäten (vielleicht in Zweig):

foreach ($entities as $entity) { 
    $entity->getAssociation()->doSomething; // sometime here you forgot to fetch sayed association 
} 

Die Lösung wäre ->addSelect() zu verwenden, in Ihr Abfrage-Generator, der die Auswahl und die Hydration von verknüpften Entitäten erzwingt.

Grundsätzlich Sie tun:

SELECT entity.* FROM entity JOIN other_entity ON ...; 

und Lehre, wenn holen die fehlenden other_entity in unerwünschten Anfragen resultierenden benötigt.

Aber Sie sollten tun:

SELECT entity.*, other_entity.* FROM entity JOIN other_entity ON ...; 

Sie sollten symfony Symbolleiste auf Ihren Wunsch zu suchen.

hoffe, das hilft

+0

, wenn ich es tun, ich ein anderes Problem haben, wie, warten Sie auf eine Entity-Klasse und gived eine OtherEntity Klasse –

+0

in Ihrem $ builder = $ this-> createQueryBuilder ("message" ) -> innerJoin ("AppBundle: User", "user", "MIT", "message.sender = user.id") -> innerJoin ("AppBundle: Thread", "Gewinde", "MIT", " message.thread = thread.id ") -> innerJoin (" AppBundle: messageMetadata“, "messageMetadata", "MIT", "messageMetadata.message = message.id UND messageMetadata.participant = user.id") ; Du könntest $ builder-> addSelect ('user') hinzufügen ... –

+0

Danke, ich werde es versuchen. In diesem Fall ist das internejoin ok, aber in anderen Fällen in meinem Projekt brauche ich einen leftjoin, denn die sind einige Datensätze wo Der Fremdschlüssel ist null. es gibt keine Möglichkeit, es in einer Anfrage mit dem Abfrage-Generator zu bekommen? –

Verwandte Themen