Symfony2 et Doctrine $em->persist VS $em->fusionner
Salut à tous j'ai une petite question quant à la Doctrine et de la différence entre merge()
et persist()
J'ai un NewsBuilder
classe:
- Cela prend une nouvelle Entité et vérifie s'il existe dans le
la base de données, si elle ne l'établit les valeurs de l'entité pour les données
passé et retourne l'entité. - Si elle n'existe pas, il crée une nouvelle News Entité définit les données et
retourne l'entité
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;
}
}
il est utilisé par un NewsPersister
Classe
Ce effectue une vérification sur mon repo à l'aide de FindByOne()
en passant l'id de données, je suis de l'analyse.
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 );
}
}
La sienne, ma question: peut déposer l' FindByOne()
déclaration et simplement utiliser $em->merge()
au lieu de $em->persist()
Suis-je en droit de penser que la $em->merge
définit l'entité soit à mettre à jour ou insérer en fonction de si l'id existe ou pas? faire mon appel supplémentaire à il repo inutiles?
OriginalL'auteur Dizzy Bryan High | 2015-04-30
Vous devez vous connecter pour publier un commentaire.
non, vous ne pouvez pas supprimer
La différence que vous faites de l'entité après.
Persistent prend une instance d'entité, il ajoute à la persistance du contexte et de fait il a réussi, donc toutes les autres mises à jour seront gérés par le gestionnaire d'entités.
De fusion va créer une nouvelle instance de l'entité, des copies de l'état de condition de l'entité, et sera fait nouvelle copie réussi, mais il passa entité ne serez pas réussi, donc, plus le changement ne sera pas mis en cache par l'entité gestionnaire de
Par votre exemple: si vous allez changer persistent à fusionner, alors il ne fera aucune différence. Afin de fusion va faire le même travail en tant que persistent. Et en général, vous devez utiliser de fusion lorsque vous avez détaché de l'entité ou de la désérialisation (j'.e de cache)
OriginalL'auteur Evgeniy Kuzmin