我遇到了这种情况,我在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这不是它应该如何工作的,不是吗?
答案 0 :(得分:0)
我设法找到答案。它基本上可以工作但不能在同一个进程中运行。如果我将脚本分成两部分 - 第一部分仍然存在,第二部分检索数据,那么产品集合将包含与类别相关的产品。
这是因为当它在单个进程中完成时,doctrine不知道所讨论的类别有产品,并且由于它检索了它刚刚保存的同一个对象并且上面创建了几行,实体管理器将不会填充使用数据库的集合,但将使用类别对象中的集合。类别对象在产品集合中没有产品,因为在产品构造函数或其他任何地方都没有$this->products()->add($category)
之类的调用。只是强制重新初始化集合,从那时起它才真正从数据库中检索产品