Symfony:按关联实体ID过滤ArrayCollection

时间:2017-05-04 19:35:05

标签: symfony filter doctrine matching arraycollection

我有一个User实体和一个Usecase实体。这两个实体由ManyToMany关联关联,但此关联还包含另一个属性,称为“环境”。为了实现这种关系,我还有一个名为UserUsecase的实体,它具有与User的ManyToOne关系,与Usecase的ManyToOne关系和额外的字段“environment”。从数据库中获取用户时,也会获取其用例,因此用户具有UserUsecase类型的对象的ArrayCollection,这些对象表示用户拥有的所有用例。我想要做的是通过usecase_id过滤这个ArrayCollection。 UserUsecase类具有以下结构:

class UserUsecase
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="userUsecases")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="Usecase", inversedBy="userUsecases")
 * @ORM\JoinColumn(name="usecase_id", referencedColumnName="id")
 */
protected $usecase; 

/**
 * @ORM\Column(type="integer")
 */
protected $environment;
}

所以我在User类中尝试了这个:

public function filterUsecases($usecase_id){
    $criteria = Criteria::create();
    $criteria->where(Criteria::expr()->eq('usecase', $usecase_id));
    return $this->userUsecases->matching($criteria);
}

对我来说有意义的是,即使UserUsecase类的字段用例是Usecase类型的对象,它也应解析为其id,并且当id匹配时等式将保持。这似乎不起作用,我找不到如何实现这种过滤。是不是可以这样做?我找到了一篇似乎完全符合我要求的相关文章,但这不符合我的情况。 Here是文章!难道我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

除非每个用户有很多用例(数千),否则我建议:

public function filterUsecases(Usecase $useCase){
    $criteria = Criteria::create();
    $criteria->where(Criteria::expr()->eq('usecase', $useCase));
    return $this->userUsecases->matching($criteria);
}

然后:

$user->filterUsecases($useCase);

或传递参考

$user->filterUsecases($em->getReference(Usecase::class, $id));