这是我第一次遇到这个问题。我想创建一个教义对象并将其传递而不必刷新它。
创建之后,我可以在对象中显示一些值,但我无法访问嵌套对象:
$em->persist($filter);
print_r($filter->getDescription() . "\n");
print_r(count($filter->getAssetClasses()));
die;
我明白了:
过滤器描述 - 0
(我应该有19个assetClass)
如果我冲洗$ filter,我仍然有同样的问题(为什么哦为什么!) 解决方案是刷新它:
$em->persist($filter);
$em->flush();
$em->refresh($filter);
print_r($filter->getDescription() . " -- ");
print_r(count($filter->getAssetClasses()));
die;
我明白了:
过滤器描述 - 19
不幸的是,你不能刷新而不刷新。
在我的实体上,我得到了以下内容:
类过滤器中的:
public function __construct()
{
$this->filterAssetClasses = new ArrayCollection();
$this->assetClasses = new ArrayCollection();
}
/**
* @var Collection
*
* @ORM\OneToMany(targetEntity="FilterAssetClass", mappedBy="filterAssetClasses", cascade={"persist"})
*/
private $filterAssetClasses;
public function addFilterAssetClass(\App\CoreBundle\Entity\FilterAssetClass $filterAssetClass)
{
$this->filterAssetClasses[] = $filterAssetClass;
$filterAssetClass->setFilter($this);
return $this;
}
在类FilterAssetClass中的:
/**
* @var Filter
*
* @ORM\ManyToOne(targetEntity="App\CoreBundle\Entity\Filter", inversedBy="filterAssetClasses")
*/
private $filter;
/**
* @var Filter
*
* @ORM\ManyToOne(targetEntity="AssetClass")
*/
private $assetClass;
public function setFilter(\App\CoreBundle\Entity\Filter $filter)
{
$this->filter = $filter;
return $this;
}
其他人确实为实体编写了代码,但我有点迷失了。我不是一个学说专家,所以如果有人能指出我的方向,那就太棒了。
于连
答案 0 :(得分:0)
但我无法访问嵌套对象
您是否首先设置了这些assetClasses?
当你处理内存中的对象时(在持久化之前),你可以添加和设置所有嵌套对象,并在内存中使用它们。
我的猜测是你认为你需要将对象存储到数据库中,以便他们分配ID。
恕我直言,这是一种不好的做法,往往会导致问题。您可以使用ramsey/uuid
库,并在Entity构造函数中设置ID:
public function __construct() {
$this->id = Uuid::uuid4();
}
数据库应仅用作存储数据的方法。应该没有业务逻辑。
我会就Doctrine的良好做法以及上述内容推荐这个video。
答案 1 :(得分:0)
您的问题与学说,持久/刷新/刷新序列无关;您描述的问题只是代码错误的症状。正如其他人所建议的那样,您不应该依赖数据库来获取数据模型。你完全可以在不使用数据库的情况下获得你所拥有的东西;数据库仅在您完成数据时存储数据。
您的Filter类应该包含一些管理它的代码:
// Filter
public function __contsruct()
{
$this->filterAssetClasses = new ArrayCollection();
}
/**
* @ORM\OneToMany(targetEntity="FilterAssetClass", mappedBy="filterAssetClasses", cascade={"persist"})
*/
private $filterAssetClasses;
public function addFilterAssetClass(FilterAssetClass $class)
{
// assuming you don't want duplicates...
if ($this->filterAssetClasses->contains($class) {
return;
}
$this->filterAssetClasses[] = $class;
// you also need to set the owning side of this relationship
// for later persistence in the db
// Of course you'll need to create the referenced function in your
// FilterAssetClass entity
$class->addFilter($this);
}
您可能已经拥有了所有这些,但是您没有显示足够的代码来了解。请注意,您可能不在setFilterAssetClass()
实体中设置了Filter
功能。