doctrine 2.5 with symfony 3.3
我有一个简单的申请活动和参与者。
function getEventDetail(){
return eventDetail;
}
function joinEvent(participant) {
***First of all***, call getEventDetail() to get latest event detail
***if participant is in list (status = 0), update it to be status = 1***
1. perform update
2. call getEventDetail()
3. return eventDetail content
***if participant is not in list, it is a new insert***
1. perform insert
2. call getEventDetail()
3. return eventDetail content
}
我的情况是,如果是更新,返回的 eventDetail 可以反映更改。但如果它是插入,则返回的 eventDetail 无法反映更改。当用户首次加入事件并且返回的响应不包含该信息时,这会导致问题。
更多详情: 在函数getEventDetail()中,有类似的东西
$queryBuilder = $this->eventRepository->createQueryBuilder('e')
->addSelect('participants_object, customer_object')
->leftJoin('e.participants', 'participants_object')
->leftJoin('participants_object.me','customer_object')
->where('e.event_key = :eventKey')->setParameter('eventKey', $eventKey);
$query = $queryBuilder->getQuery();
$eventDetailObject = $query->getOneOrNullResult();
$participantCollection = $eventDetailObject->getParticipants();
在函数 joinEvent() 中,主要是像下面这样(如果更新)
$participant = $this->participantRepository->
findOneBy(['event' => $currentEventDetail['id'], 'me' => $userID]);
$participant->setStatus(1);
$participant = $this->participantRepository->save($participant);
//after update successfully
return $latestEventDetail = $this->getEventDetailByEventKey($eventKey);
(如果插入)
$event = $this->eventRepository->getById($currentEventDetail['id']);
$me = $this->customerRepository->getById($userID);
$newParticipant = new Participant();
$newParticipant->setEvent($event);
$newParticipant->setMe($me);
$newParticipant = $this->participantRepository->save($newParticipant);
//if insert success
return $latestEventDetail = $this->getEventDetailByEventKey($eventKey);
我想指出一件事,因为我不确定我是否正确使用了findOneBy。事件和我是与参与者对象链接的异物。(但从测试结果来看,它按预期工作)
$participant = $this->participantRepository->
findOneBy(['event' => $currentEventDetail['id'], 'me' => $userID]);
什么潜在问题导致更新和插入操作之间的差异?谢谢。
最后我通过在事件对象上执行另一个保存查询来解决此问题
$event->addParticipant($newParcipant);
$this->eventRepository->save($event);
我认为这是关于级联问题的事情。但现在对我来说仍然没有太大意义。我的一个假设是,原则足够聪明,它知道在HTTP请求中之前执行了相同的查询,因此它返回相同的(作为过时的)数据,而无需第二次实际查询数据库。