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的行,因为在你的班上艺人关系中有一个级联保持。它改变了什么吗?