doctrine2检查一个实体是否与ManyToMany关系中的其他实体相关

时间:2012-12-02 15:25:31

标签: php doctrine-orm

例如,我有2个实体:eventuser都有ManyToMany关系。

class Event {

/**
 * @Id @Column(type="integer") @GeneratedValue
 */
protected $id;
/**
 * @ManyToMany(targetEntity="User", inversedBy="participated_events")
 */
protected $participations;
}

class User {

/**
 * @Id @Column(type="integer") @GeneratedValue
 * */
protected $id;
/**
 * @ManyToMany(targetEntity="Event", inversedBy="participations")
 */
protected $participated_events;
}

如何检查$em->getRepository('event')->find(RANDOM_ID)$em->getRepository('user')->find(RANDOM_ID)是否与参与相关?换句话说,如何检查用户是否参加了此活动?什么是最好的方法?我知道我可以参加所有参与活动并查看foreach(),但我认为这一定是一种更简单的方法。

感谢。

1 个答案:

答案 0 :(得分:1)

您必须创建自定义存储库DQL并选择要执行的字段。

我个人而言,避免Doctrines多对多的关系,因为我更容易做你想做的事情,如果我在join_table中需要额外的列。所以,我几乎总是创建一个连接实体,其中包含相应的manyTo one和onetoMany引用。所以在你的实例中会有一个ParticipatedEvent实体,它有很多ToOne用户和很多ToOne事件(以及他们的目标Entites oneToMany)你仍然有你的关系,但你有额外的连接模型(或实体)

所以,你最终会这样:

   $particpated_event = $em->getRepository('ParticipatedEvents')->findOneBy('event_id'=>RANDOM_ID, 'user_id'=>RANDOM_USER_ID);
   if($particpated_event) {
       $event =  $particpated_event->getEvent(); //or get user.
   }

你可以做这样的事情

$particpated_events = $em->getRepository('event')->find(RANDOM_ID)->getParticipatedEvents();
foreach( $particpated_events as  $particpated_event){

      $user = $particpated_event->getUser();
  }

再次看看最适合你的是什么。如上所述,您可以使用DQL查询创建Repository类