Symfony2 - SQLSTATE [23000]:完整性约束违规:1062重复条目 - SonataAdminBundle - INSERT后更新

I use SonataAdminBundle. My goal is to manage my articles and so allow administrators to create through the admin interface.

Here's how the relationship is defined in my User class.

So I have to use:

     /**
    * @var articles
    *
    * Here we will set the OneToMany relationship (Many: One - article : user) 
    * @ORM\OneToMany(targetEntity="Kark\RecetteBundle\Entity\Article", mappedBy="user", cascade={"persist", "remove"})
    */
    protected $articles;

    public function __construct()
    {
        //Une classe à pour instrctruction dans sont constructeur, le constructeur du parent
        parent::__construct();

        $this->articles = new \Doctrine\Common\Collections\ArrayCollection();
    }

   /**
    * Get articles
    *
    * @return ArrayCollection
    */
    public function getArticles()
    {
        return 

$articles;
    }


   /**        
    *
    * @param $unArticle
    */
    public function addArticle(\Kark\RecetteBundle\Entity\Article $unArticle)
    {
        $this->articles[] = $unArticle;
        $unArticle->setUser($this);
    }

And here in my class Article:

/**
  *      @ORM\ManyToOne(targetEntity="Kark\UserBundle\Entity\User", inversedBy="articles")
  */
  private $user;

/**
 * Set user
 *
 * @param User
 * @return article
 */
 public function setUser(\Kark\UserBundle\Entity\User $unUser)
 {
    $this->user = $unUser;

    return $this;
 }

 /**
 * Get user
 *
 * @return User
 */
  public function getUser()
  {
     return $this->user;
  }

In my SonataAdminBundle I then defined the constroller CRUD two entities User and Article:

    namespace Kark\AdminBundle\Controller;

    use Sonata\AdminBundle\Controller\CRUDController as Controller;

    class ArticleAdminController extends Controller
    {

    }

Here is the CRUD User:

<?php

namespace Kark\AdminBundle\Controller;

use Sonata\AdminBundle\Controller\CRUDController as Controller;

class UserAdminController extends Controller
{

}

and their configurations in admin.cfg:

# Kark/AdminBundle/Resources/config/admin.yml
services:
    kark.admin.admin.article:
        class: Kark\AdminBundle\Admin\ArticleAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: Article, label: articles }
        arguments:
            - ~
            - Kark\RecetteBundle\Entity\Article
            - KarkAdminBundle:ArticleAdmin

Here's the part for the User entity:

kark.admin.admin.userarticle:
    class: Kark\AdminBundle\Admin\UserAdmin
    tags:
        - { name: sonata.admin, manager_type: orm, group: user, label: users }
    arguments:
        - ~
        - Kark\UserBundle\Entity\User
        - KarkAdminBundle:UserAdmin

Everything is set up, and I have the following definition in my class Admin of my Article:

<?php

namespace Kark\AdminBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Kark\RecetteBundle\Entity\Article;
use Kark\RecetteBundle\Entity\ImageArticle;

use Knp\Menu\ItemInterface as MenuItemInterface;

class ArticleAdmin extends Admin
{
     // setup the default sort column and order
    protected $datagridValues = array(
        '_sort_order' => 'ASC',
        '_sort_by' => 'name'
    );


    // L'ensemble des champs qui seront montrer lors de la création ou de la modification d'une entité
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('General')
                ->add('titre', 'text')
                ->add('imageArticle', 'sonata_type_admin', array('delete' => false), array('required' => true, 'edit' => 'inline'))
                ->add('contenu','textarea');
     }

    /**
    *
    * Fonction qui va permettre d'afficher les différent filtres de recherche dans notre tableau
    * de notre interface.
    *
    */
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('titre')
            ->add('user.username')
        ;
    }

    /**
    * Fonction qui redéfini celle de la classe mère Admin. Cette fonction va nous permettre de préciser les
    * champs qui seront affiché dans notre tableau lorsque l'on listera nos entités
    */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('titre')
            ->add('date', null, array('route' => array('name' => 'show')))
            ->add('contenu')
            ->add('user.username')
            ->add('_action', 'actions', array(
                'actions' => array(
                'show' => array(),
                'edit' => array(),
                'delete' => array()
                )
            ))
        ;
    }

    /**
    * Fonction qui redéfinie la fonction de la classe mère qui permet d'indiquer les champs qui seront affiché
    * lorsque l'on consultera un article
    */
    protected function configureShowFields(ShowMapper $showMapper)
    {
        $showMapper
            ->add('date')
            ->add('titre')
            ->add('contenu')
            ->add('imageArticle.getWebPath()', 'string', array('template' => 'KarkAdminBundle:ArticleAdmin:list_image.html.twig'))
            ->add('user.username')
        ;
    }


 /**
     * {@inheritdoc}
     */
    public function prePersist($object)
    {

        $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
        $user->addArticle($object);
    }

    /**
     * {@inheritdoc}
     */
    public function preUpdate($object)
    {
        $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
        $user->addArticle($object);
    }
}

However, the article does not insert because it performs INSERT and UPDATE, and in table 'article_audit it performs the same insert twice, and so there is a primary key dupliquata ...

[3/4] UniqueConstraintViolationException: An exception occurred while executing 'INSERT INTO article_audit (rev, revtype, imageArticle_id, user_id, id, date, titre, contenu, publication, dateEdition, slugTitre) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["545", "UPD", 43, 1, 43, "2014-06-16 23:28:40", "qsmodjqskdjqslkdqjsk", "<p>qsldkqsmldkqslmdkqsmdlqslk lmqskdmlqskdqsmld qskdjqslkdqjsldqksd<\/p>", 0, "2014-06-16 23:28:40", "qsmodjqskdjqslkdqjsk"]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '43-545' for key 'PRIMARY'

 PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '43-545' for key 'PRIMARY'

Here is the log file:

DEBUG - INSERT INTO article (date, titre, contenu, publication, dateEdition, slugTitre, imageArticle_id, user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - INSERT INTO article_audit (rev, revtype, imageArticle_id, user_id, id, date, titre, contenu, publication, dateEdition, slugTitre) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - UPDATE article SET date = ?, titre = ?, contenu = ?, publication = ?, dateEdition = ?, slugTitre = ?, imageArticle_id = ?, user_id = ? WHERE id = ?
DEBUG - INSERT INTO article_audit (rev, revtype, imageArticle_id, user_id, id, date, titre, contenu, publication, dateEdition, slugTitre) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - "ROLLBACK"
CRITICAL - Uncaught PHP Exception Sonata\AdminBundle\Exception\ModelManagerException: "Failed to create object: Kark\RecetteBundle\Entity\Article" at /var/www/recette-etudiant/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php line 142

UPDATE -

I try to insert the traditional way, that is to say with an action in my ArticleController which reads:

public function ajouterNewsAction($_local) { // The whole creation will be through this form $monArticle = new Article();

         // We create our form using an external class 
         $monFormulaire = $this->createForm(new ArticleType, $monArticle);                   

       // Query is recovered 
       $request = $this->get('request');

         // When sending a form, it is realized through transfer data from page to page via a method 
    //called POST. So we'll check when calling this function if this method is effective, if the case is 
    //data that have been transmitted via a data form. 
       if($this->get('request')->getMethod() == 'POST')
       {
         // Process the data here we will moisturize our form with what was before retrieving values 
      // my $ _POST superglobal via a rather fast function
         $monFormulaire->bind($request);

         // Check that the values ​​entered are correct. Validation objects is via annotation 
      // Constraints our class Validator aliased via our @ Assert. 
         if($monFormulaire->isValid())
         {


            // If the item is actually add is that everything is good then created a Tag 
           $this->get('session')->getFlashBag()->add('AjoutRealise', 'L\'article a été rajouté avec succès');


            // Get the current utilistaeur 
           $user = $this->getUser();

           // We persist then our body hydrated by Form 
           $entity_manager = $this->getDoctrine()->getManager();

           // Get the service management of user FOSUserBundle
           $userManager = $this->get('fos_user.user_manager');


           //We add a user to our article
           $user->addArticle($monArticle);
           $userManager->updateUser($user);

           $entity_manager->flush();

           //We redirect to the page display section 
           return $this->redirect($this->generateUrl('karkrecette_voir_article', array("id" => $monArticle->getId(), "slugTitre" => $monArticle->getSlugTitre() )));
       }
     }

     // If we're not in the presence of a méthde get is that the form is not sent, then it is blank 
//Otherwise it is possible that the form is not valid, it displays the form hydrating value previously entered 
     return $this->render('KarkRecetteBundle:Article:ajouter.html.twig', array("form" => $monFormulaire->createView(), "langue" => $_local));
     }

If i delete in the admin.yml the service defined for my administration of my Article class, their is no problem because the SonataAdmin is not fired. But i really NEED to administrate my Article object.

Thanks.

When I had update Symfony 2.3 to 2.6@dev in my composer.json, I solve my problem. For sure, it was just an internal problem.

The problem is in your User class :

/**        
*
* @param $unArticle
*/
public function addArticle(\Kark\RecetteBundle\Entity\Article $unArticle)
{
    $this->articles[] = $unArticle;
    $unArticle->setUser($this);
}

it should be as

/**        
*
* @param $unArticle
*/
public function addArticle(\Kark\RecetteBundle\Entity\Article $unArticle)
{
    $this->articles[] = $unArticle;
}

because you have mapping one-to-many relationship between User and Article and according to your above code in User class it is violating the integrity constraint because it basically try to set many user for one article ..