2013-01-24 4 views
21

Supponiamo di avere due entità Utente e Prodotto correlate da una relazione molti-a-molti con Doctrine.Un modo corretto per verificare se esiste una relazione molti-a-molti - Symfony2/Doctrine

Mi piacerebbe sapere il modo migliore per gestire un metodo $ user-> hasProduct ($ product) per la mia entità Utente che restituisce true è una relazione esistente o false in caso contrario.

Attualmente sto facendo questo:

public function hasProduct($id) 
{ 
    foreach($this->getProducts() as $product) { 
     if($product->getId() == $id) { 
      return true; 
     } 
    } 

    return false; 
} 

ma non sono sicuro che sia il modo migliore, soprattutto se ci sono molti rapporti nel ciclo.

Se qualcuno ha qualcosa di meglio, fatemelo sapere :)

risposta

49

La funzione getProducts ti dà un ArrayCollection.

Basta fare

if($user->getProducts()->contains($product)) //the real product object not the id 
     //your stuff 

Edit:

Per template ramoscello:

{% if product in user.products %} 
    //your stuff 
{% endif %} 
+0

Sembra buono! Lo userò. C'è un modo per eseguire questo nei modelli di ramoscello? –

+0

E se voglio controllare, ad es. se esce il prodotto con un nome specifico? – Abdel5

+0

È necessario eseguire il ciclo manuale dei prodotti o utilizzare una query 'DQL' personalizzata – Pierrickouw

0

ero alle prese con lo stesso problema, e mi sono imbattuto this blog che ha risolto il problema facendo uso di filtri Doctrine.

Se ho ben capito il problema in modo corretto e si dispone di tre tabelle (utente, user_product e di prodotto) si dovrebbe essere in grado di riscrivere la vostra funzione hasProduct ($ id) come questo:

use Doctrine\Common\Collections\Criteria; 

public function hasProduct(int $productId): bool { 

    $criteria = Criteria::create(); 
    $criteria->where(Criteria::expr()->eq('id', $productId)); 

    if(count($this->products->matching($criteria)) > 0) { 
    return true; 
    } 

    return false; 
} 

Quando si esegue questo codice, Doctrine non carica tutti i prodotti collegati all'utente. Effettua infatti solo una query sulla tabella di riferimento incrociato (user_product).