我被困在这种情况下,我在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)
这样的调用。从那以后,它仅强迫重新初始化收集工作起作用,它真正从数据库中检索了产品