Bonjour,

Je débute sur Symfony 3 et je rencontre un problème en essayant de persister un objet dans ma base de donnée via Doctrine.

Ce que je fais

Dans mon controlleur principal, j'instancie un objet de test auquel je fournis des valeurs diverses.

    /**
     * @Route("/nouvelobjet", name="nouvelobjet")
     */
    public function newAction(Request $request)
    {
    $objet = new Objet();
    $objet->setIdvendeur('1');
    $objet->setTitre('Article de test');
    $objet->setDescription('blablah');
    $objet->setPrix('10');
    $objet->setCategorie('Autres');
    $objet->setLieu('Paris');
    $objet->setActive('1');
    $em = $this->getDoctrine()->getManager();
    $em->persist($objet);
    $em->flush();
    return new Response ('Id_vendeur:'.$objet->getIdvendeur());
    }

Ma classe objet est la suivante:

/**
 * @ORM\Entity
 * @ORM\Table(name="objet")
 */
class Objet
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id_article;

    /**
     * @ORM\Column(type="integer")
     */
    private $id_vendeur;

    /**
     * @ORM\Column(type="string")
     */
    private $titre;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    /**
     * @ORM\Column(type="integer")
     */
    private $prix;

    /**
     * @ORM\Column(type="string")
     */
    private $categorie;

        /**
     * @ORM\Column(type="string")
     */
    private $lieu;

    /**
     * @ORM\Column(type="boolean")
     */
    private $active;

     /**
     * @ORM\ManyToOne(targetEntity="Membre", inversedBy="objets")
     * @ORM\JoinColumn(name="id_vendeur", referencedColumnName="id")
     */
    private $membre;

   ... Je masque la suite du code qui contient les getteurs et setteurs, si vous en avez besoin je l'ajouterais

Ce que je veux

Simplement persister mon objet dans ma base de donnée

Ce que j'obtiens

An exception occurred while executing 'INSERT INTO objet (id_vendeur, titre, description, prix, categorie, lieu, active) VALUES (?, ?, ?, ?, ?, ?, ?)' with params [null, "Article de test", "blablah", "10", "Autres", "Paris", "1"]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_vendeur' cannot be null

Pour une raison que j'ignore, la variable id_vendeur semble nulle
Je bloque sur cette erreur depuis quelques jours déja, une aide ou une piste serait grandement appréciée.
Merci de votre aide.

7 réponses


Hello,

C'est normal puisque tu n'as pas precisé que l'id de ton entité est auto increment.
Donc lors du flush il s'attend à ce que tu renseignes ton id.

Pour que ton entité soit en auto increment il va falloir ajouter l'annotation ci-dessous sur ton entité.

/**
* @ORM\Entity
* @ORM\Table(name="objet")
* @ORM\GeneratedValue(strategy="AUTO")
**/
class Objet {
  .....
}

N'oublie pas de mettre à jour ton bd.

Voila voila

En fait, j'ai bien une propriété qui s'auto incrémente ($id_article), mais ce n'est pas celle qui me pose souci, car c'est $id_vendeur que je souhaite définir.

Dac dac

Mais ton id_vendeur il ne peut pas êtres null donc :
Soit tu le definit avec ton setIdVendeur
Soit tu mets nullable à true sur ton champ id_vendeur.

Voila voila

C'est ce que je fais dans mon controleur principal, regarde la ligne :

    ....
    $objet = new Objet();
    $objet->setIdvendeur('1');
    $objet->setTitre('Article de test');
    ....

Je sêche car quand je mets en commentaire la ligne

$em->flush();

Je peux vérifier que la propriété Idvendeur est bien à 1.

Je trouve ton code bizzare parceque le nom des id des objet est normalement generer automatiquement par symfony
et normalement si ta un nom id_vendeur sa veut dir que ta surment un object vendeur
si c'est le cas c'est simple : l'id ne doit pas etre gerer par toi mais par symfony
tu cree un objet vendeur : $vendeur = new vendeur();

puis tu fait object->setVendeur($vendeur);

Tu dois assigner un objet vendeur a ta méthode setVendeur() et non un id (d'ailleurs si tu regardes bien ta classe Objet il n'y a aucune méthode setIdVendeur() ...)

/**
     * @Route("/nouvelobjet", name="nouvelobjet")
     */
    public function newAction(Request $request)
    {
    $vendeur  = $this->getDoctrine()->getManager()->getRepository('TonBundle:Vendeur')->find(1);
    $objet = new Objet();
    $objet->setVendeur($vendeur);
    $objet->setTitre('Article de test');
    $objet->setDescription('blablah');
    $objet->setPrix('10');
    $objet->setCategorie('Autres');
    $objet->setLieu('Paris');
    $objet->setActive('1');
    $em = $this->getDoctrine()->getManager();
    $em->persist($objet);
    $em->flush();
    return new Response ('Id_vendeur:'.$objet->getIdvendeur());
    }