Symfony/Doctrine:不能在不刷新的情况下使用对象



这是我第一次遇到这个问题。我想创建一个教义对象并传递它,而不必冲洗它。

创建后,我可以在对象中显示一些值,但我无法访问嵌套对象:

    $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()函数。

相关内容

  • 没有找到相关文章

最新更新