'NotNullConstraintViolationException' 在 Symfony 3 上使用 flush() 时出错
'NotNullConstraintViolationException' Error when flush() on Symfony 3
我开始学习 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>');
}
}
?>
这是我使用的类 'Objet' :
<?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;
}
}
这是 class 'Membre'(不确定它在那里真的有用):
<?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;
}
}
当我进入控制器的 url 时,我抛出一个错误:
An exception occurred while executing 'INSERT INTO objet (id_vendeur, titre) VALUES (?, ?)' with params [null, "Article de test"]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_vendeur' cannot be null
当我评论“$em->flush();”时行,我可以毫无问题地打印 getIdVendeur() 的值,所以它不是空值。
我被这个问题困住了 3 天...有人可以帮我解决这个问题吗?提前致谢!
假设在数据库对象 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>');
}
可能您不需要 class Objet
的属性 id_vendeur
。
希望对您有所帮助
我开始学习 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>');
}
}
?>
这是我使用的类 'Objet' :
<?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;
}
}
这是 class 'Membre'(不确定它在那里真的有用):
<?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;
}
}
当我进入控制器的 url 时,我抛出一个错误:
An exception occurred while executing 'INSERT INTO objet (id_vendeur, titre) VALUES (?, ?)' with params [null, "Article de test"]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_vendeur' cannot be null
当我评论“$em->flush();”时行,我可以毫无问题地打印 getIdVendeur() 的值,所以它不是空值。
我被这个问题困住了 3 天...有人可以帮我解决这个问题吗?提前致谢!
假设在数据库对象 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>');
}
可能您不需要 class Objet
的属性 id_vendeur
。
希望对您有所帮助