2013-01-24 10 views
21

Załóżmy, że mam dwie jednostki związane z użytkownikiem i produktem w związku wiele do wielu z Doctrine.Właściwy sposób sprawdzenia, czy istnieje powiązanie wiele do wielu - Symfony2/Doctrine

Chciałbym wiedzieć, jak najlepiej obsłużyć metodę $ user-> hasProduct ($ product) dla mojej jednostki użytkownika, która zwraca wartość true, czy istnieje relacja lub fałsz, jeśli nie.

Jestem obecnie to robi:

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

    return false; 
} 

ale nie jestem pewien, że to najlepszy sposób, zwłaszcza jeśli istnieje wiele relacje w pętli.

Jeśli ktoś ma coś lepszego, daj mi znać :)

Odpowiedz

49

Twoja funkcja getProducts daje ArrayCollection.

Wystarczy zrobić

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

Edit:

Dla gałązka Szablon:

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

Brzmi nieźle! Użyję tego. Czy istnieje sposób na wykonanie tego w szablonach gałązkowych? –

+0

A co jeśli chcę sprawdzić np. czy produkt o podanej nazwie się kończy? – Abdel5

+0

Musisz ręcznie przechodzić między produktami lub użyć niestandardowego zapytania 'DQL'. – Pierrickouw

0

męczyłem się z tym samym problemem, i natknąłem this blogu wpis, który rozwiązał ten problem korzystając z filtrów Doctrine.

Jeśli rozumiem Twojego problemu poprawnie i masz trzy tabele (użytkownik, user_product i produkty) powinien być w stanie przepisać hasProduct ($ id) Funkcja tak:

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; 
} 

Po uruchomieniu tego kodu, Doctrine nie ładuje wszystkich Produktów powiązanych z Użytkownikiem. W rzeczywistości dotyczy to jedynie tabeli odniesień (user_product).

Powiązane problemy