' NotNullConstraintViolationException'在Symfony 3上flush()时出错

时间:2016-09-11 19:27:34

标签: php doctrine-orm symfony flush

我开始学习Symfony 3,但是在尝试使用Doctrine在我的数据库上刷新Objet时遇到了错误。

在我的主控制器上,我实例化一个Objet,我在其上设置了一些属性默认值。

<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Objet;
use AppBundle\Entity\Membre;

class DefaultController extends Controller
{
    /**
    * @Route("/new", name="nouvelobjet")
    */
    public function newAction(Request $request)
    {
        $objet = new Objet();
        $objet->setIdVendeur('2');
        $objet->setTitre('Article de test');
        $em = $this->getDoctrine()->getManager();
        $em->persist($objet);
        $em->flush();
        return new Response ('<body>Id_vendeur:'.$objet->getIdVendeur().'</body>');
    }
} 
?>

这是Classe&#39; Objet&#39;我用:

<?php
// src/AppBundle/Entity/Objet.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
/**
 * @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\ManyToOne(targetEntity="Membre", inversedBy="objets")
     * @ORM\JoinColumn(name="id_vendeur", referencedColumnName="id")
     */
    private $membre;

    /**
     * Get idArticle
     *
     * @return integer
     */
    public function getIdArticle()
    {
        return $this->id_article;
    }

    /**
     * Set idVendeur
     *
     * @param integer $idVendeur
     *
     * @return Objet
     */
    public function setIdVendeur($idVendeur)
    {
        $this->id_vendeur = $idVendeur;

        return $this;
    }

    /**
     * Get idVendeur
     *
     * @return integer
     */
    public function getIdVendeur()
    {
        return $this->id_vendeur;
    }

    /**
     * Set titre
     *
     * @param string $titre
     *
     * @return Objet
     */
    public function setTitre($titre)
    {
        $this->titre = $titre;

        return $this;
    }

    /**
     * Get titre
     *
     * @return string
     */
    public function getTitre()
    {
        return $this->titre;
    }


    /**
     * Set membre
     *
     * @param \AppBundle\Entity\Membre $membre
     *
     * @return Objet
     */
    public function setMembre(\AppBundle\Entity\Membre $membre = null)
    {
        $this->membre = $membre;

        return $this;
    }

    /**
     * Get membre
     *
     * @return \AppBundle\Entity\Membre
     */
    public function getMembre()
    {
        return $this->membre;
    }
}

这是班级&#39; Membre&#39; (不确定它在那里真的很有用):

<?php
// src/AppBundle/Entity/Membre.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
/**
 * Membre
 *
 * @ORM\Table(name="membre")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MembreRepository")
 */
class Membre
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="Objet", mappedBy="membre")
     */
    private $objets;

    public function __construct()
    {
    $this->objets = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
    return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Membre
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Add objet
     *
     * @param \AppBundle\Entity\Objet $objet
     *
     * @return Membre
     */
    public function addObjet(\AppBundle\Entity\Objet $objet)
    {
        $this->objets[] = $objet;

        return $this;
    }

    /**
     * Remove objet
     *
     * @param \AppBundle\Entity\Objet $objet
     */
    public function removeObjet(\AppBundle\Entity\Objet $objet)
    {
        $this->objets->removeElement($objet);
    }

    /**
     * Get objets
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getObjets()
    {
        return $this->objets;
    }
}

当我去控制器的网址时,我抛出一个错误:

  

执行&#39; INSERT INTO对象(id_vendeur,titre)VALUES(?,?)&#39;用params [null,&#34; Article de test&#34;]:   SQLSTATE [23000]:完整性约束违规:1048列&#39; id_vendeur&#39;不能为空

当我评论&#39; $ em-&gt; flush();&#39;我可以毫无问题地打印getIdVendeur()的值,所以它不是空值。

我花了3天时间才解决这个问题...有人可以帮我解决这个问题吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

假设在数据库对象Membre中存在id = 2,您可以在控制器中执行以下操作:

public function newAction(Request $request)
    {
        $objet = new Objet();
        $objet->setIdVendeur('2');
        $objet->setTitre('Article de test');
        $em = $this->getDoctrine()->getManager();

        // Retreive the object instance with id = 2
        $membre = $em->find(Membre::class, 2);
        // Set/specify the doctrine relations  
        $objet->setMembre($membre);   

        $em->persist($objet);
        $em->flush();
        return new Response ('<body>Id_vendeur:'.$objet->getIdVendeur().'</body>');
    }

您可能不需要班级id_vendeur的{​​{1}}属性。

希望这个帮助