2016-10-20 3 views
1

Ich versuche zu erzeugen, eine Auswahl bieten mit> 300 EntscheidungenEin einzelner EntityType eine große Menge von Abfragen

$form->add('products', EntityType::class, array(
    'class' => Product::class, 
    'query_builder' => function (ProductRepository $er) use ($customerId) { 
     return $er->QBByCustomer($customerId); 
    }, 
    'choice_label' => 'l.name', 
)); 

Die Querybuilder:

public function QBByCustomer($customer = null) 
{ 
    return $this->QB() 
     ->addSelect('p.name AS HIDDEN name') 
     ->join('p.customer', 'c') 
     ->join('p.label', 'l') 
     ->where('c.customer = :customer') 
     ->setParameter('customer', $customer) 
     ->addOrderBy('name') 
    ; 
} 

Wenn ich die Form machen, Lehre erzeugt > 300 Abfragen, um alle verwandten Objekte zu laden.

Gibt es eine Möglichkeit, Doctrine anzuweisen, die Beschriftungen aus dem QueryBuilder zu verwenden, statt so viele Abfragen wie auswählbare Elemente abzufeuern?

+0

können Sie zeigen eine dieser Abfrage? Nach was suchen sie? – Matteo

+1

Zeigen Sie den Code und die Zuordnung der Produkteinheit an. – Gerry

+1

Ich schlage folgendes vor: benutze den fetch = "extra_lazy" für die Entity - Beziehung, die Verwendung von ',' multiple '=> true,' expanded '=> true' –

Antwort

2

Da das angezeigte Label von einer verknüpften Entität abgerufen wird (label), müssen wir Doctrine helfen, es zu laden.

Hier ist, wie die Querybuilder aussehen sollte:

'query_builder' => function (ProductRepository $er) use ($customerId) { 
    $qb = $er->QBByCustomer($customerId); 
    $qb->addSelect('partial p.{id}'); 
    $qb->addSelect('partial l.{id, name}'); 
    return $qb; 
}, 
'choice_label' => 'label.name', 
Verwandte Themen