24

假设我有两个实体 User 和 Product 与 Doctrine 的多对多关系相关。

我想知道为返回 true 的 User 实体处理 $user->hasProduct($product) 方法的最佳方法是关系存在,否则返回 false。

我目前正在这样做:

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

    return false;
}

但我不确定这是最好的方法,特别是如果循环中有很多关系。

如果有人有更好的东西,请告诉我:)

4

2 回答 2

61

你的函数getProducts给你一个ArrayCollection.

做就是了

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

编辑 :

对于树枝模板:

{% if product in user.products %}
    //your stuff
{% endif %}
于 2013-01-24T14:33:16.993 回答
4

我在同样的问题上苦苦挣扎,并且遇到了这个博客条目,它通过使用 Doctrine Filters 解决了这个问题。

如果我正确理解您的问题并且您有三个表(user、user_product 和 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)。

于 2018-01-18T06:51:27.930 回答