Doctrine orm 如何确定条令实体是否持续存在?
有没有一种方法可以确定某个参数是否是一个已被信条持久化的对象?类似于实体管理器方法,该方法检查对象是否不是普通的旧对象,而是实际上已经存在于内存/持久化中的对象Doctrine orm 如何确定条令实体是否持续存在?,doctrine-orm,Doctrine Orm,有没有一种方法可以确定某个参数是否是一个已被信条持久化的对象?类似于实体管理器方法,该方法检查对象是否不是普通的旧对象,而是实际上已经存在于内存/持久化中的对象 <?php public function updateStatus(Entity $entity, EntityStatus $entityStatus) { $entityManager = $this->getEntityManager(); try { // checking pers
<?php
public function updateStatus(Entity $entity, EntityStatus $entityStatus)
{
$entityManager = $this->getEntityManager();
try {
// checking persisted entity
if (!$entityManager->isPersisted($entity)) {
throw new InvalidArgumentException('Entity is not persisted');
}
// ...
} catch (InvalidArgumentException $e) {
}
}
编辑:正如@Andrew Atkinson所说,似乎
EntityManager->contains($entity)
是现在的首选方式
前面的答案:您必须像这样使用UnitOfWork api:
$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity);
class EntityManager {
// ...
public function contains($entity)
{
return $this->unitOfWork->isScheduledForInsert($entity)
|| $this->unitOfWork->isInIdentityMap($entity)
&& ! $this->unitOfWork->isScheduledForDelete($entity);
}
EntityManager
方法包含用于此目的。看
在原则2.4中,实现如下所示:
$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity);
class EntityManager {
// ...
public function contains($entity)
{
return $this->unitOfWork->isScheduledForInsert($entity)
|| $this->unitOfWork->isInIdentityMap($entity)
&& ! $this->unitOfWork->isScheduledForDelete($entity);
}
检查实体是否已刷新的一种更简单、更可靠的方法,只需检查ID即可
if (!$entity->getId()) {
echo 'new entity';
} else {
echo 'already persisted entity';
}
此解决方案在很大程度上取决于具体情况,但它可能是最适合您的
编辑:
从评论来看,这似乎不是最相关的答案,但可能会对某些人有用,因为它与问题密切相关。UnitOfWork标记为@internal。这通常意味着建议您删除该用法或用其他构造替换它。使用EntityManager->contains($entity)
应优先使用EntityManager->contains($entity)返回1,但flush comand返回500错误,有什么建议吗?持久化对象是否已经有id?我还以为是因为脸红only@arnaudbey我认为情况就是这样,这使得答案几乎无关紧要。将编辑应答这在使用Postgresql数据库时不起作用:将实体持久化到实体管理器且id归属于实体时。在这种情况下(使用postgresql),您可以检查实体是否被持久化,而不是像您在回答中提到的那样刷新实体。。。为了避免使用db之间的差异,应该使用API。这不适用于我设置ID的模拟对象(例如在测试中)。这就是答案!