2017-05-04 4 views
2

J'ai une entité utilisateur et une entité Usecase. Ces 2 entités sont associées par une association ManyToMany, mais cette association contient également une autre propriété, appelée "environnement". Pour implémenter cette relation, j'ai aussi une entité appelée UserUsecase qui a une relation ManyToOne avec User, une relation ManyToOne avec Usecase et le champ "environnement" supplémentaire. Lors de l'extraction d'un utilisateur à partir de la base de données, ses données d'utilisateur sont également récupérées, de sorte que l'utilisateur dispose d'une ArrayCollection d'objets de type UserUsecase représentant toutes les données d'utilisation d'un utilisateur. Ce que je veux faire est de filtrer cette ArrayCollection par usecase_id. La classe UserUsecase a la structure ci-dessous:Symfony: Filter ArrayCollection par l'ID d'entité associée

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

J'ai donc essayé ceci à l'intérieur de la classe utilisateur:

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

Il me semble logique que même le usecase sur le terrain de la UserUsecase de classe est un objet de type Usecase, il devrait se résoudre à son id et l'équation se tiendrait lorsque les ids correspondent. Cela ne semble toujours pas fonctionner, et je ne peux pas trouver comment implémenter ce filtrage. N'est-il pas possible de le faire de cette façon? J'ai trouvé un article pertinent qui semble faire exactement ce que je veux mais cela ne fonctionne pas dans mon cas. Here est l'article! Est-ce que je fais quelque chose de mal?

Merci d'avance!

Répondre

1

Sauf si vous avez beaucoup de nombreux cas d'utilisation par utilisateur (en milliers): Je recommande

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

Puis:

$user->filterUsecases($useCase); 

Ou passer référence

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