【问题标题】:doctrine 2 entity is not filled with childs element学说 2 实体未填充子元素
【发布时间】:2019-07-06 05:13:12
【问题描述】:

在我的数据库中,我有两个相关的表。

应用预订

AppBooking服务

AppBookingService 有一个 AppBooking 的外键

我使用这种方法在第一个和第二个表中进行插入。

public function bookingExecute($data){
    try{
        $this->em->beginTransaction();
        $appBooking = $this->_fillAppBooking($data);
        $this->em->persist($appBooking);
        if(array_key_exists("appService",$data) && is_array($data['appService']) && count($data['appService']) > 0){
            foreach($data['appService'] as  $bookingService){
                $appBookingService = $this->_fillAppBookingService($bookingService,$appBooking);
                $this->em->persist($appBookingService);
                $this->em->flush();
            }
        }
        $this->em->flush();
        $this->em->commit();
        return $appBooking;
    }catch (\Exception $ex){
        $this->em->rollback();
        throw new BookingException("",BookingError::BOOKING_QUERY_ERROR);
    }
}

数据写入正确

之后,在同一个 http 请求中,我调用下面的方法以便在我的实体中拥有 AppBooking 服务数据

$appBooking = $this->bookingService->findOne($id);

我得到的AppBooking实体不包含AppBookingService的问题

方法

$appBooking->getServices()->count()

返回 0

如果我在另一个 http 请求中进行相同的调用,我会得到想要的结果。

就好像学说没有在同一个请求中更新实体

这是 AppBooking 的一部分

/**
 * @var Collection
 * @ORM\OneToMany(targetEntity="AppBookingService", mappedBy="idBooking")
 */
private $services;

public function __construct() {
    $this->services = new ArrayCollection();
}

这是 AppBookingService 的一部分

/**
 * @var \Entity\Entity\AppBooking
 *
 * @ORM\ManyToOne(targetEntity="Entity\Entity\AppBooking", inversedBy="services")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="ID_BOOKING", referencedColumnName="ID_BOOKING", nullable=true)
 * })
 */
private $idBooking;

【问题讨论】:

    标签: doctrine-orm doctrine one-to-many


    【解决方案1】:

    这是因为在运行时

    $appBooking = $this->bookingService->findOne($id);
    

    实体是从他的内部代理缓存中获取的。不执行数据库查询来获取实体的数据。对于它已经加载的关联也是如此。 代理缓存在 http 请求执行期间有效。

    要解决此问题,您必须手动更新 $services 集合或 refresh 实体。

    $this->em->refresh($appBooking);
    

    刷新数据库中实体的持久状态,覆盖任何尚未持久的本地更改。

    您还可以clear在调用 findOne() 方法之前缓存整个实体管理器。

    $this->em->clear();
    

    清除 EntityManager。当前由该 EntityManager 管理的所有实体都将分离。

    参考文献

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多