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