学说OneTomany关系不提供相关的实体



我被困在这种情况下,我在Symfony文档的一个示例中重现了它,这里的外观:

fixtures

/**
 * @ORMEntity
 */
class Category
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue
     */
    private $id;
    /**
     * @ORMOneToMany(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;
    }
}

和相关产品类

/**
 * @ORMEntity
 */
class Product
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue
     */
    protected $id;
    /**
     * @ORMManyToOne(targetEntity="Category", inversedBy="products")
     * @ORMJoinColumn(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个产品。

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

workaround

我正在调试产品的PersistentCollection,并且可以看到其标志设置为initialized = true。因此,我能够通过致电

来强迫这种工作
$c->products()->setInitialized(false);
$c->products()->initialize();

但是阿法克(Afaik(不是应该如何工作的,应该吗?

我设法找到了答案。它基本上是有效的,但在同一过程中运行时不起作用。如果我将脚本分为两个 - 第一个持续存在,第二个将检索数据,那么产品集合将包含与类别相关的产品。

这是因为当它在单个进程学说中完成时,不知道该类别具有产品,并且由于它检索了它刚刚保存的相同对象,并且在上面创建了几行,因此Entity Manager不会填充该集合使用数据库,但将使用类别对象中的集合。并且类别对象在产品收集中没有产品,因为在产品构造函数或其他任何地方都没有$this->products()->add($category)这样的调用。从那以后,它仅强迫重新初始化收集工作起作用,它真正从数据库中检索了产品

相关内容

  • 没有找到相关文章