【问题标题】:Symfony2 and Doctrine $em->persist VS $em->mergeSymfony2 和 Doctrine $em->persist VS $em->merge
【发布时间】:2023-03-11 11:31:01
【问题描述】:

您好,我有一个关于 Doctrine 以及 merge()persist() 之间区别的快速问题

我有一个NewsBuilder 类:

  • 这需要一个新闻实体并检查它是否存在于 数据库,如果是,则将实体的值设置为数据 传递并返回实体。
  • 如果它不存在,它会创建一个新的新闻实体来设置数据并
    返回实体

namespace FantasyPro\DataBundle\Builder;

use FantasyPro\DataBundle\Entity\News;
use FantasyPro\DataBundle\Helpers\DateHelper;

class NewsBuilder
{
    /**
     * @var DateHelper $dateHelper
     */
    private $dateHelper;

    public function __construct( DateHelper $dateHelper )
    {
        $this->dateHelper = $dateHelper;
    }

    public function buildNews( $currentNews = null, $news)
    {
        if ( ! $currentNews) { // check if we already have the news stored
            $currentNews = new News();
        }
        $currentNews->setNewsID( $news['NewsID'] );
        $currentNews->setTitle( $news['Title'] );
        $currentNews->setUpdated( $this->dateHelper->parseDate( $news['Updated'] ) );
        $currentNews->setUrl( $news['Url'] );
        $currentNews->setContent( $news['Content'] );
        $currentNews->setSource( $news['Source'] );
        $currentNews->setTermsOfUse( $news['TermsOfUse'] );
        $currentNews->setTeam( $news['Team'] );
        $currentNews->setPlayerID( $news['PlayerID'] );

        return $currentNews;
    }
}

这是由 NewsPersister 类使用的

这使用 FindByOne() 传递我正在解析的数据的 id 对我的 repo 执行检查。

    namespace FantasyPro\DataBundle\Persisters;

    use Doctrine\ORM\EntityManager;
    use FantasyPro\DataBundle\Builder\NewsBuilder;
    use FantasyPro\DataBundle\Entity\News;

    class NewsPersister {

        /**
         * @var EntityManager $em
         */
        private $em;
        /**
         * @var NewsBuilder $builder
         */
        private $builder;

        public function __construct( EntityManager $em, NewsBuilder $builder )
        {
            $this->em      = $em;
            $this->builder = $builder;
        }

        public function Persist($news){
            //get the news repository
            $repo = $this->em->getRepository( 'DataBundle:News' );

            // get the current news from the db
            $criteria    = array(
                'newsID' => $news['NewsID']
            );

            /**
             * @var News $currentNews
             */
            $currentNews = $repo->FindOneBy( $criteria );

            //todo: use a logger to write this data to file

            //build the news entity
            $currentNews = $this->builder->buildNews( $currentNews, $news );

            //persist the team
            $this->em->persist( $currentNews );
        }
    }

我的问题是:可以删除FindByOne() 语句并简单地使用$em->merge() 而不是$em->persist()

我是否认为$em->merge 将实体设置为更新或插入取决于 id 是否存在?不需要我额外调用他的 repo 吗?

【问题讨论】:

    标签: symfony merge doctrine persist


    【解决方案1】:

    不,你不能删除

    区别在于你对实体的处理。

    Persist 获取一个实体实例,将其添加到持久化上下文并对其进行管理,因此所有其他更新都将由实体管理器管理。

    Merge 将创建实体的新实例,从提供的实体复制状态,并将管理新的副本,但传递的实体不会被管理,因此实体管理器不会缓存进一步的更改

    以您的示例为例:如果您将坚持更改为合并,那么它不会有任何区别。所以合并将做与持久化相同的工作。通常,当您分离实体或未序列化(即来自缓存)时,您应该使用合并

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多