例如,我有2个实体:event
和user
都有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()
,但我认为这一定是一种更简单的方法。
感谢。
答案 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类