symfony / doctrine:不刷新

时间:2017-04-04 14:44:15

标签: php symfony doctrine-orm doctrine

这是我第一次遇到这个问题。我想创建一个教义对象并将其传递而不必刷新它。

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

    $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;
}

其他人确实为实体编写了代码,但我有点迷失了。我不是一个学说专家,所以如果有人能指出我的方向,那就太棒了。

于连

2 个答案:

答案 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功能。