PHP Doctrine2持久化Entity vs new Entity

时间:2016-02-24 21:37:30

标签: php doctrine-orm

我一直在网上看,看起来我是唯一一个因此而烦恼/沮丧的人...... 让我解释一下。

我正在使用Doctrine2来构建一系列实体 像这样的东西
(省略所有学说注释,吸气剂和制定者):

<?php

class Article
{
    protected $id;
    protected $name;
    protected $categories = [];
}

class Category
{
    protected $id;
    protected $name;
    protected $articles = [];
}

// create some categories
$cat1 = new Category();
$cat1->setName('cat-01');

$cat2 = new Category();
$cat2->setName('cat-02');

$cat3 = new Category();
$cat3->setName('cat-03');

// new Article
$article = new Article();
$article->setName('foo');
$article->setCategories([$cat1, $cat2, $cat3]);

现在,如果您需要过滤文章的类别,则必须使用array_filter();

$cats = array_filter($article->getCategories(), function($cat) {
    return $cat->getName() === 'cat-01';
});

对......这是有道理的。

但是,一旦Article对象被持久化并从DB中恢复,您就可以使用PersistentCollection :: filter(Closure $ c)方法 尽管

,array_filter不起作用
$entityManager->persist($article);
$entityManager->flush();


$article = $entityManager->getRepository('Article')->findById(1);
$cats = $article->getCategories()->filter(function($cat) {
    return $cat->getName() === 'cat-01';
});

与array_map()vs PersistentCollection :: map()相同 或current()vs PersistentCollection :: current()
等等。

现在...
问题是,我的非持久化实体是否有办法以与持久化实体相同的方式工作? 或者有没有办法让这个工作在持久化和非持久化实体上?

$cats = $article->getCategories()->filter(function($cat) {
    return $cat->getName() === 'cat-01';
});

1 个答案:

答案 0 :(得分:2)

尝试使用doctrine的ArrayCollection,而不是使用原生数组,这可能与您的持久实体使用的类型相同:

use Doctrine\Common\Collections\ArrayCollection;

class Article
{
    protected $id;
    protected $name;
    protected $categories;

    function __construct() {
       $this->categories = new ArrayCollection();
    }        
}

class Category
{
    protected $id;
    protected $name;
    protected $articles;

    function __construct() {
       $this->articles = new ArrayCollection();
    }        
}

现在,以下内容应适用于非持久性实体:

// create some categories
$cat1 = new Category();
$cat1->setName('cat-01');

$cat2 = new Category();
$cat2->setName('cat-02');

$cat3 = new Category();
$cat3->setName('cat-03');

// new Article
$article = new Article();
$article->setName('foo');
$article->setCategories([$cat1, $cat2, $cat3]);

$cats = $article->getCategories()->filter(function($cat) {
    return $cat->getName() === 'cat-01';
});

您没有显示代码,但我猜测问题在于您的Articles :: setCategories方法。我怀疑你有

class Articles {
  public function setCategories(array categories) {
    $this->categories = $categories;

这会导致您的ArrayCollection被常规的php数组覆盖。

取而代之的是:

class Articles {
  public function setCategories(array categories) {
    foreach($categories as $category) {
      $this->categories[] = $category;

这将保留数组集合并允许过滤器函数适用于新实体以及检索到的实体。