Doctrine OneToMany关系不会获取相关实体

时间:2017-04-26 09:32:37

标签: symfony doctrine-orm doctrine

我遇到了这种情况,我在symfony文档的一个例子中再现了它,在这里它看起来如何:

照明灯

/**
 * @ORM\Entity
 */
class Category
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    private $id;
    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category", fetch="EAGER")
     */
    private $products;

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

    public function products(): Collection
    {
        return $this->products;
    }

    public function id()
    {
        return $this->id;
    }
}

及相关产品类

/**
 * @ORM\Entity
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $category;

    public function __construct($category)
    {
        $this->category = $category;
    }

    public function id()
    {
        return $this->id;
    }

    public function category()
    {
        return $this->category;
    }
}

TEST

现在我有一段测试代码,我想获取分类并能够获得其产品:

$cat = new Category();
$prod = new Product($cat);

$this->entityManager->persist($prod);
$this->entityManager->persist($cat);
$this->entityManager->flush();

$crepo = $this->getEntityManager()->getRepository(Category::class);
$c = $crepo->findAll()[0];

var_dump(get_class($c->products()), $c->products()->count())

我得到的是PersistentCollection类的产品,这是预期的,但计数为0,而应该有1个产品。

我可以看到,在数据库中,我有适当的外键设置的类别和产品记录。

解决方法

我正在为产品调试PersistentCollection,并且可以看到它的标志设置为initialized = true。有了这个,我可以通过调用

强制这个工作
$c->products()->setInitialized(false);
$c->products()->initialize();

但是afaik这不是它应该如何工作的,不是吗?

1 个答案:

答案 0 :(得分:0)

我设法找到答案。它基本上可以工作但不能在同一个进程中运行。如果我将脚本分成两部分 - 第一部分仍然存在,第二部分检索数据,那么产品集合将包含与类别相关的产品。

这是因为当它在单个进程中完成时,doctrine不知道所讨论的类别有产品,并且由于它检索了它刚刚保存的同一个对象并且上面创建了几行,实体管理器将不会填充使用数据库的集合,但将使用类别对象中的集合。类别对象在产品集合中没有产品,因为在产品构造函数或其他任何地方都没有$this->products()->add($category)之类的调用。只是强制重新初始化集合,从那时起它才真正从数据库中检索产品