2013-01-24 115 views
21

假設我有兩個實體用戶和產品通過與Doctrine的多對多關係相關。正確的方法來檢查是否存在多對多關係 - Symfony2/Doctrine

我想知道爲我的用戶實體處理$ user-> hasProduct($ product)方法返回true的最佳方式是關係存在或否則返回false。

目前,我正在做這個:

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

    return false; 
} 

但我不知道這是最好的方式,特別是如果在環路許多關係。

如果有人有更好的東西,讓我知道:)

回答

49

你的功能getProducts給你一個ArrayCollection

只是做

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

編輯:

對於樹枝模板:

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

聽起來不錯!我會用它。有沒有辦法在樹枝模板中執行此操作? –

+0

如果我想檢查如果具有給定名稱的產品退出? – Abdel5

+0

您必須手動循環訪問產品或使用自定義的「DQL」查詢 – Pierrickouw

0

我用同樣的問題所困擾,通過它完成解決了這個問題this博客條目來了通過使用Doctrine Filters。

如果我正確理解你的問題,你有三個表(用戶,user_product和產品),你應該能夠重寫hasProduct($ id)的功能是這樣的:

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

運行此代碼, Doctrine不加載鏈接到用戶的所有產品。它實際上只查詢交叉引用表(user_product)。

相關問題