假设我有两个实体User和Product与Doctrine的多对多关系。
我想知道为我的User实体处理$ user-> hasProduct($ product)方法的最佳方法是返回true是关系存在,否则返回false。
我目前正在这样做:
public function hasProduct($id)
{
foreach($this->getProducts() as $product) {
if($product->getId() == $id) {
return true;
}
}
return false;
}
但我不确定这是最好的方式,特别是如果循环中有很多关系。
如果某人有更好的事情,请告诉我:)。
答案 0 :(得分:52)
您的功能getProducts
会为您提供ArrayCollection
。
只做
if($user->getProducts()->contains($product)) //the real product object not the id
//your stuff
修改:
对于树枝模板:
{% if product in user.products %}
//your stuff
{% endif %}
答案 1 :(得分:1)
我正在努力解决同样的问题,并且遇到this博客条目,通过使用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)。