这是我第一次遇到这个问题。我想创建一个教义对象并传递它,而不必冲洗它。
创建后,我可以在对象中显示一些值,但我无法访问嵌套对象:
$em->persist($filter);
print_r($filter->getDescription() . "n");
print_r(count($filter->getAssetClasses()));
die;
我得到:
过滤器说明 -- 0
(我应该有 19 个资产类别(
如果我冲洗$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
*
* @ORMOneToMany(targetEntity="FilterAssetClass", mappedBy="filterAssetClasses", cascade={"persist"})
*/
private $filterAssetClasses;
public function addFilterAssetClass(AppCoreBundleEntityFilterAssetClass $filterAssetClass)
{
$this->filterAssetClasses[] = $filterAssetClass;
$filterAssetClass->setFilter($this);
return $this;
}
在类中 过滤器资产类:
/**
* @var Filter
*
* @ORMManyToOne(targetEntity="AppCoreBundleEntityFilter", inversedBy="filterAssetClasses")
*/
private $filter;
/**
* @var Filter
*
* @ORMManyToOne(targetEntity="AssetClass")
*/
private $assetClass;
public function setFilter(AppCoreBundleEntityFilter $filter)
{
$this->filter = $filter;
return $this;
}
其他人确实为实体编写了代码,我有点迷茫。我不是教义专家,所以如果有人能指出我一个好的方向,那就太棒了。
朱利安
但我无法访问嵌套对象
您首先设置了这些资产类吗?
在处理内存中的对象时(在持久化之前(,可以添加和设置所有嵌套对象,并在仍在内存中使用这些对象。
我的猜测是,您认为需要将对象存储到数据库中,以便它们分配其ID。
恕我直言,这是一种不好的做法,经常会引起问题。可以改用ramsey/uuid
库,并在实体构造函数中设置 ID:
public function __construct() {
$this->id = Uuid::uuid4();
}
数据库应仅用作存储数据的方法。不应存在任何业务逻辑。
我会推荐这个关于教义良好实践的视频,以及上面提到的内容。
您的问题与原则或持久/刷新/刷新序列无关;您描述的问题只是错误代码的症状。正如其他人所建议的那样,您不应该依赖数据库来获取数据模型。您应该能够在不使用数据库的情况下完全获得您所追求的东西;数据库仅在您完成数据时存储数据。
筛选器类应包含一些管理此内容的代码:
// Filter
public function __contsruct()
{
$this->filterAssetClasses = new ArrayCollection();
}
/**
* @ORMOneToMany(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);
}
您可能已经拥有所有这些,但是您没有展示足够的代码来了解。请注意,您可能不应该在Filter
实体中setFilterAssetClass()
函数。