Symfony 2多对一不能为空
我有:Symfony 2多对一不能为空,symfony,doctrine-orm,persist,Symfony,Doctrine Orm,Persist,我有: An exception occurred while executing 'INSERT INTO image (image_name, artiste_id) VALUES (?, ?)' with params ["537bd9df69db9.png", null]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'artiste_id' cannot be null 我与公司的“形象”和“艺术
An exception occurred while executing 'INSERT INTO image (image_name, artiste_id) VALUES (?, ?)' with params ["537bd9df69db9.png", null]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'artiste_id' cannot be null
我与公司的“形象”和“艺术家”有多对一的关系。我真的看不出问题出在哪里
我的实体图像:
<?php
namespace Acme\ArtisteBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Acme\ArtisteBundle\Entity\Artiste;
/**
* Acme\ArtisteBundle\Entity\Image
*
* @ORM\Table(name="image")
* @ORM\Entity(repositoryClass="Acme\ArtisteBundle\Entity\ImageRepository")
* @ORM\HasLifecycleCallbacks
* @Vich\Uploadable
*/
class Image
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Assert\File(
* maxSize="1M",
* mimeTypes={"image/png", "image/jpeg", "image/pjpeg"}
* )
* @Vich\UploadableField(mapping="product_image", fileNameProperty="imageName")
*
* @var File $image
*/
public $image;
/**
* @var string $imageName
* @ORM\Column(type="string", length=255, name="image_name", type="integer", nullable=false)
*/
protected $imageName;
/**
* @ORM\ManyToOne(targetEntity="Acme\ArtisteBundle\Entity\Artiste", inversedBy="image", cascade={"remove"})
* @ORM\JoinColumn(name="artiste_id", referencedColumnName="id", nullable=false)
*/
private $artiste;
/**
* Set artiste
*
* @param \Acme\ArtisteBundle\Entity\Artiste $artiste
*/
public function setArtiste(\Acme\ArtisteBundle\Entity\Artiste $artiste)
{
$this->artiste = $artiste;
}
/**
* Get artiste
*
* @return \Acme\ArtisteBundle\Entity\Artiste
*/
public function getArtiste()
{
return $this->artiste;
}
/**
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
*/
public function setImage(File $image)
{
$this->image = $image;
}
/**
* Get Image
* @return File
*/
public function getImage()
{
return $this->image;
}
/**
* @param string $imageName
*/
public function setImageName($imageName)
{
$this->imageName = $imageName;
}
/**
* @return string
*/
public function getImageName()
{
return $this->imageName;
}
}
我一直坚持,但我总是无效。任何帮助都将不胜感激:尝试在多通注释中添加持久化选项
/**
* @ORM\ManyToOne(targetEntity="Acme\ArtisteBundle\Entity\Artiste", inversedBy="image", cascade={"remove","persist"})
* @ORM\JoinColumn(name="artiste_id", referencedColumnName="id", nullable=false)
*/
private $artiste;
要确保双向关系,有一个技巧: 在Artister类中,修改setter setImage,如下所示:
public function setImage(\Doctrine\Common\Collections\Collection $image)
{
foreach ($image as $img) {
$img->setArtiste($this);
}
$this->image = $image;
}
public function setArtiste($artiste)
{
$this->artiste = $artiste;
$artiste->addImage($this);
}
此外,为了更好地阅读代码,我建议将类Artister中的图像字段重命名为images,因为该字段是图像实体的集合
我也在这篇文章中读到,你可以这样做,选择这两个解决方案中的一个,如果你创建图像,然后将Artiste附加到创建的图像=从反面保存,第二个解决方案很有趣:
在类图像中,修改setter setartist,如下所示:
public function setImage(\Doctrine\Common\Collections\Collection $image)
{
foreach ($image as $img) {
$img->setArtiste($this);
}
$this->image = $image;
}
public function setArtiste($artiste)
{
$this->artiste = $artiste;
$artiste->addImage($this);
}
这应该行得通
public function addImage(\Acme\ArtisteBundle\Entity\Image $image)
{
if(!$this->image->contains($image)){
$this->image[] = $image;
$image->setArtiste($this);
}
}
您能否显示完整的错误消息以及负责保存实体的操作方法?我刚刚编辑了我的帖子,您能否尝试第二种解决方案?始终没有更改?如果在$userManager->updateUser$user;->$用户->添加图像$image;然后可以删除行$image->setArtiste$user;还有保持$image的行,因为在你的班上艺人关系中有一个级联保持。它改变了什么吗?