持久化

时间:2016-01-11 16:00:34

标签: php doctrine-orm doctrine

我遇到了Doctrine 2的问题,无法找到解决方案。似乎在坚持实体(并冲洗它)时。当尝试使用指定的id在DB中搜索它时,在同一个PHP进程中,doctrine给了我实体的缓存版本,而不是构建一个具有所有正确关系的正确版本。我的问题是我的实体有一些多对多或多对一连接,如果我得到缓存版本,所有这些属性都会返回null而不是\ Doctrine \ Common \ Collections \ Collection的实例。 有没有什么方法可以强制学说生成或更新我的实体以分配所有这些连接,或者至少强制它为那个从缓存中提供给我的实体内容提供服务?

如所要求的例子:

class A extends AbstractDoctrineEntity {

/**
 * @var int
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Column(type="integer")
 */    
protected $id;

/**
 * @var \Core\Entity\B
 * @ORM\ManyToOne(targetEntity="Core\Entity\B")
 */
protected $relationB;

/**
 * @var \Doctrine\Common\Collections\Collection
 * @ORM\ManyToMany(targetEntity="Core\Entity\C", inversedBy="relationA", fetch="EXTRA_LAZY")
 *
 */
protected $relationC;

//getters and setters
}


class B extends AbstractDoctrineEntity {

/**
 * @var int
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Column(type="integer")
 */    
protected $id;

/**
 * @var \Core\Entity\A
 * @ORM\OneToMany(targetEntity="Core\Entity\A")
 */
protected $relationA;

//getters and setters
}

class B extends AbstractDoctrineEntity {

/**
 * @var int
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Column(type="integer")
 */    
protected $id;

/**
 * @var \Core\Entity\A
 * @ORM\ManyToMany(targetEntity="Core\Entity\A", mappedBy="realtionC", cascade={"persist", "remove")
 */
protected $relationA;

//getters and setters
}

// Service

class SomeService implements ServiceLocatorAwareInterface, MultiRepositoryServiceInterface {
use ServiceLocatorAwareTrait, MultiRepositoryServiceTrait;

public function createA(\Core\Entity\B $b) {
    $a = new \Core\Entity\A();
    $a->setB($b);
    $this->getRepository('a')->persist($a); // gets entity manager persists entity $a and flushes

    return $a;
    /**
     * returns an object
     * a = {
     *   id = 2,
     *   relationB = Core\Entity\B,
     *   ralationC = null,
     */
       }

}

public function getA($id){
    $a = $this->getRepository('a')->persist($a); // retrieves object manager and queries by id;

    return $a;
    //**
     * returns an object
     * a = {
     *   id = 2,
     *   relationB = Core\Entity\B,
     *   ralationC = \Doctrine\Common\Collections\Collection,  //which is an empty collection prototype and exactly what i need to retrieve in the first case when persisting the entity.
     *   }
     */

}
}

编辑:  找到一个解决方案,这可能不是最好的方法,所以如果有人知道一个更好的方法请更新,但现在它的工作原理:

-----
public function createA(\Core\Entity\B $b) {
    $a = new \Core\Entity\A();
    $a->setB($b);
    $this->getRepository('a')->persist($a); // gets entity manager persists entity $a and flushes
    $this->getRepository('a')->detatch($a); // removes entity from management

    return $this->getRepository('a')->find($a->getId());
    /**
     * returns an object
     * a = {
     *   id = 2,
     *   relationB = Core\Entity\B,
     *   ralationC = \Doctrine\Common\Collections\Collection,
     */
       }

}
----

这在分离后的重新查询方面存在缺点,并且会对性能产生负面影响。如果有人知道更好的解决方案,我们将不胜感激。

0 个答案:

没有答案