2016-07-05 1 views
0

Я не могу сохранить данные в таблицах, используя отношение oneTomany в doctrain2 и ZF2.Doctrain ZF2: не удалось сохранить данные для oneToMany Relation

он дает ошибку внешнего ключа MySQL.

An exception occurred while executing 'INSERT INTO phv_image (path, name, suggestion_id) VALUES (?, ?, ?)' with params ["test.png", "test", null]: 

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

Мой код

1 Entity

<?php 

use Doctrine\ORM\Mapping as ORM; 

/** 
* PhvImage 
* 
* @ORM\Table(name="phv_image", indexes={@ORM\Index(name="suggestion_id", columns={"suggestion_id"})}) 
* @ORM\Entity 
*/ 
class PhvImage 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="bigint", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="path", type="string", length=500, nullable=false) 
    */ 
    private $path; 

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

    /** 
    * @var \PhvSuggestion 
    * 
    * @ORM\ManyToOne(targetEntity="PhvSuggestion", inversedBy="images") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="suggestion_id", referencedColumnName="id") 
    * }) 
    */ 
    private $suggestion; 


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

    /** 
    * Set path 
    * 
    * @param string $path 
    * 
    * @return PhvImage 
    */ 
    public function setPath($path) 
    { 
     $this->path = $path; 

     return $this; 
    } 

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

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

     return $this; 
    } 

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

    /** 
    * Set suggestion 
    * 
    * @param \PhvSuggestion $suggestion 
    * 
    * @return PhvImage 
    */ 
    public function setSuggestion(\Application\Entity\PhvSuggestion $suggestion = null) 
    { 
     $this->suggestion = $suggestion; 

     return $this; 
    } 

    /** 
    * Get suggestion 
    * 
    * @return \PhvSuggestion 
    */ 
    public function getSuggestion() 
    { 
     return $this->suggestion; 
    } 
} 

2 Entity

<?php 
namespace Application\Entity; 
use Doctrine\ORM\Mapping as ORM; 
/** 
* PhvSuggestion 
* 
* @ORM\Table(name="phv_suggestion", indexes={@ORM\Index(name="user_id", columns={"user_id"})}) 
* @ORM\Entity 
*/ 
class PhvSuggestion extends Entity 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="bigint", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    public $id; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="subject", type="string", length=500, nullable=false) 
    */ 
    private $subject; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="description", type="text", length=65535, nullable=false) 
    */ 
    private $description; 
    /** 
    * @var \PhvUser 
    * 
    * @ORM\ManyToOne(targetEntity="PhvUser") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id") 
    * }) 
    */ 
    private $user; 
    /** 
    * @ORM\OneToMany(targetEntity="PhvImage", mappedBy="suggestion", cascade={"persist"}) 
    */ 
    public $images; 
    private $data = null; 
    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
    /** 
    * Set subject 
    * 
    * @param string $subject 
    * 
    * @return PhvSuggestion 
    */ 
    public function setSubject($subject) 
    { 
     $this->subject = $subject; 
     return $this; 
    } 
    /** 
    * Get subject 
    * 
    * @return string 
    */ 
    public function getSubject() 
    { 
     return $this->subject; 
    } 
    /** 
    * Set description 
    * 
    * @param string $description 
    * 
    * @return PhvSuggestion 
    */ 
    public function setDescription($description) 
    { 
     $this->description = $description; 
     return $this; 
    } 
    /** 
    * Get description 
    * 
    * @return string 
    */ 
    public function getDescription() 
    { 
     return $this->description; 
    } 
    /** 
    * Set user 
    * 
    * @param \PhvUser $user 
    * 
    * @return PhvSuggestion 
    */ 
    public function setUser(PhvUser $user = null) 
    { 
     $this->user = $user; 
     return $this; 
    } 
    /** 
    * Get user 
    * 
    * @return \PhvUser 
    */ 
    public function getUser() 
    { 
     return $this->user; 
    } 
    public function setImages($images){ 
     $this->images = $images; 
     return $this; 
    } 
    public function getImages() { 
     return $this->images; 
    } 
} 

Контроллер

public function saveAction() { 
     $data = $this->getRequest()->getPost()->toArray(); 
     $imgObj = new \Application\Entity\PhvImage(); 
     $imgObj->setPath('test.png'); 
     $imgObj->setName('test'); 

     $imgObj2 = new \Application\Entity\PhvImage(); 
     $imgObj2->setPath('new.png'); 
     $imgObj2->setName('new'); 

     $arr = array(
       $imgObj,$imgObj2 
     ); 

    $sugg = new \Application\Entity\PhvSuggestion(); 
$sugg->setUser(1); 
$sugg->setImages($arr); 
$sugg->setDescription('test'); 
      $sugg->setSubject('sub'); 
      $em->persist($sugg); 
      $em->flush(); 

    } 

Не могли бы вы помочь мне решить эту проблему.

ответ

0

Первый в классе PhvSuggestion вам нужно добавить конструктор в следующем:

public function __construct() 
{ 
    $this->images = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

Затем измените setImages на:

public function addImages(\Doctrine\Common\Collections\Collection $images) 
{ 
    foreach ($images as $image) { 
     $image->setSuggestion($this); 
     $this->images->add($image); 
    } 
} 

Вы можете найти все эти подробности в документации Doctrine 2 ,

+0

Я не могу решить эту проблему, используя вышеуказанное решение. в том, что изображения не сохраняются в таблице, только предложение получает спасение. – Ravi

+0

Спасибо Mohammad ZeinEddin! Проблема решена – Ravi

Смежные вопросы