gpt4 book ai didi

Symfony2 和 Doctrine $em->persist VS $em->merge

转载 作者:行者123 更新时间:2023-12-02 18:30:13 25 4
gpt4 key购买 nike

您好,我有一个关于 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 对我的存储库进行检查。

    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 是否存在将实体设置为更新或插入?使我对他的存储库的额外调用变得不必要吗?

最佳答案

不,您无法删除

区别在于您之后对实体所做的操作。

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

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

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

关于Symfony2 和 Doctrine $em->persist VS $em->merge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com