2013-01-22 42 views
2

這裏是(EDITED :完整的文件內容)的實體在控制器Symfony2中和學說,柱不能爲空與OneToOne關係

// Eve\MoonBundle\Entity\MoonMaterial.php 

namespace Eve\MoonBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

//use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Table(name="_moon_material") 
* @ORM\Entity() 
*/ 
class MoonMaterial 
{ 

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

    // relations start 

    /** 
    * @ORM\OneToOne(targetEntity="Eve\DumpBundle\Entity\invTypes") 
    * @ORM\JoinColumn(name="typeID", referencedColumnName="typeID") 
    */ 
    private $invTypes_byTypeID; 

    public function get_invTypes_byTypeID() 
    { 
     return $this->invTypes_byTypeID; 
    } 

    // relations end 

    /** 
    * @ORM\Column(name="userID", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="NONE") 
    */ 
    private $userID; 

    /** 
    * @ORM\Column(name="moonID", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="NONE") 
    */ 
    private $moonID; 

    /** 
    * @ORM\Column(name="typeID", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="NONE") 
    */ 
    private $typeID; 

    /** 
    * Set userID 
    * 
    * @param integer $userID 
    * @return MoonMaterial 
    */ 
    public function setUserID($userID) 
    { 
     $this->userID = $userID; 

     return $this; 
    } 

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

    /** 
    * Set moonID 
    * 
    * @param integer $moonID 
    * @return MoonMaterial 
    */ 
    public function setMoonID($moonID) 
    { 
     $this->moonID = $moonID; 

     return $this; 
    } 

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

    /** 
    * Set typeID 
    * 
    * @param integer $typeID 
    * @return MoonMaterial 
    */ 
    public function setTypeID($typeID) 
    { 
     $this->typeID = $typeID; 

     return $this; 
    } 

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

} 

代碼(EDITED

// Eve\MoonBundle\Controller\IndexController.php 
namespace Eve\MoonBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Eve\MoonBundle\Entity\MoonMaterial; 

class IndexController extends Controller 
{ 

    public function defaultAction($moonName) 
    { 
     // ... 
     $dc = $this->getDoctrine(); 
     $form = $this 
      ->createFormBuilder() 
      ->add('typeID', 'choice', $choiceSettings) 
      ->getForm(); 

     if ($this->getRequest()->isMethod('post')) 
     { 
      $form->bind($this->getRequest()); 
      { 
       $data = $form->getData(); 
       $typeID = $data['typeID']; 

       if (is_int($typeID)) 
       { 
        $em = $dc->getEntityManager(); 
        $mm = $em->getRepository('EveMoonBundle:MoonMaterial'); 

        $result = $mm->findOneBy(array(
          'userID' => $this->getUser()->getID(), 
          'typeID' => $typeID, 
          'moonID' => $moon->getItemID())); 

        if ($result) 
        { 
         $em->remove($result); 
         $em->flush(); 
        } 

        $moonMaterial = new MoonMaterial(); 
        $moonMaterial 
         ->setUserID($this->getUser()->getID()) 
         ->setTypeID($typeID) 
         ->setMoonID($moon->getItemID()); 


        $em->persist($moonMaterial); 
        $em->flush(); 
       } 
      } 
     } 

     $twig = 'EveMoonBundle:Index:default.html.twig'; 
     return $this->render($twig, array(
       'formAddMoonMaterial' => $form->createView())); 
    } 

} 

時我試試這個,我得到錯誤

An exception occurred while executing 'INSERT INTO _moon_material (userID, moonID, typeID) VALUES (?, ?, ?)' with params {"1":38,"2":40001583,"3":null}: 

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

但是,當我評論OneToOne(代碼上面)關係它工作正常,所以主要麻煩是描述OneToOne關係...請幫助處理它

我想要什麼,我想重寫條目,如果存在於表「_moon_material」或簡單地寫,如果不

PS:我需要一個只爲「讀」如果你想允許空值設置

@ORM\JoinColumn(name="typeID", referencedColumnName="typeID") 

到(由ID聯接名稱)

+0

請發佈invTypes和MoonMaterial的完整類。這個錯誤顯然不在你認爲的地方 – AdrienBrault

+0

看編輯代碼,我改了它 – user1954544

+0

那麼你怎麼看?麻煩在哪裏?有任何想法嗎? – user1954544

回答

1

我不知道爲什麼,我不能這樣做單向的關係,所以我解決它通過雙向添加一些代碼來invTypes表註釋

+0

有類似的問題,這個技巧解決了它,謝謝!!!!! –

6

關係

@ORM\JoinColumn(name="typeID", referencedColumnName="typeID", nullable=true) 

並且您應該讓列'typeID'也爲空。 (請參閱How do I modify a MySQL column to allow NULL?

如果您不想擁有NULL,只需做相反的事。

+0

正如我所說,我需要這種關係(invTypes表)只能通過「id」獲得「名稱」,在任何情況下都不能刪除\ add \編輯 我不明白您的代碼如何幫助我 – user1954544

0

我會檢查實體中的方法setTypeID(),它很可能是因爲您不期望設置屬性,因此爲null。

+0

代碼補充請看看它 – user1954544

0

$invTypes_byTypeID$typeID屬性都映射到相同的typeID列。你不能用教條來做到這一點。

我建議您刪除$typeID屬性,而不是使用「類型ID」,使用類型實例並將其設置爲$invTypes_byTypeID屬性。

我想,這將意味着改變你形成等等

+0

所以我必須在MoonMaterial中更改$ typeID(name),就是這樣嗎? – user1954544

+0

我將所有typeID名稱更改爲userTypeID和....仍然存在SQLSTATE [23000]上的錯誤:完整性約束違規:1048'userTypeID'列不能爲空' – user1954544

+0

您可以顯示您的示例嗎?完整代碼 – user1954544