2012-08-31 46 views
0

我有這樣的關係:Doctrine2 - 如何改變持有端,如何設置NOT NULL

class TaskSet 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection $tasks 
    * 
    * @ORM\OneToMany (targetEntity="Task", mappedBy="taskset", cascade={"ALL"}) 
    */ 
    private $tasks; 

class Task 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var TaskSet $taskset 
    * 
    * @ORM\ManyToOne(targetEntity="TaskSet", inversedBy="tasks") 
    */ 
    private $taskset; 

生成的SQL是這樣的:

CREATE TABLE task (
    id INT AUTO_INCREMENT NOT NULL, 
    taskset_id INT DEFAULT NULL, 
    INDEX IDX_527EDB255D67FAA4 (taskset_id), PRIMARY KEY(id) 
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB; 

CREATE TABLE task_set (
    id INT AUTO_INCREMENT NOT NULL, 
    PRIMARY KEY(id) 
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB; 

ALTER TABLE task ADD CONSTRAINT FK_527EDB255D67FAA4 FOREIGN KEY (taskset_id) REFERENCES task_set (id) 

由於現在一切都很好,我得到了一個(測試集)許多(測試)雙向關係。

不幸的是Doctrine2選擇任務實體持有端實體之間,這個代碼不持久關係:所以最後的問題

INSERT INTO `task_set` (`id`, `name`, `description`) VALUES (1, 'task 1', 'desc 1'); 
INSERT INTO `task` (`id`, `taskset_id`, `name`, `className`) VALUES (1, NULL, 'task 1', 'class name 1'); 

    從上面的代碼

    輸出
    $em = $this->getDoctrine()->getEntityManager(); 
    
    $taskset = new TaskSet(); 
    $taskset->setName('task 1'); 
    $taskset->setDescription('desc 1'); 
    
    $task = new Task(); 
    $task->setName('task 1'); 
    $task->setClassName('class name 1'); 
    $taskset->addTask($task); 
    
    $em->persist($taskset); 
    $em->flush(); 
    

  1. 有沒有辦法改變擁有方(當然我不能恢復關係)?
  2. 如何將taskset_id標記爲NOT NULL?

回答

2
  1. 在課堂上使用taskset,編輯addTask($任務)功能並添加在末尾:

    $ task-> setTaskset($ t他的);

  2. 正如卡洛斯在評論中所說,我的第一篇文章並沒有真正回答這個問題。 您必須使用可空屬性在JoinColumn定義:

    類任務 { /** * 整數@var $ ID * * @ORM \列(名稱= 「ID」,類型=「整數「) * @ORM \ Id * @ORM \ GeneratedValue(strategy =」AUTO「) */ private $ id;

    /** 
    * @var TaskSet $taskset 
    * 
    * @ORM\JoinColumn(nullable=false) 
    * @ORM\ManyToOne(targetEntity="TaskSet", inversedBy="tasks") 
    */ 
    private $taskset; 
    

初步答案:

  1. 使用Validator,你的情況NotNull驗證器,在您的任務類的$ taskset的財產。

從Symfony2中的文檔實例:

// src/Acme/BlogBundle/Entity/Author.php 
use Symfony\Component\Validator\Constraints as Assert; 

class Author 
{ 
    /** 
    * @Assert\NotNull() 
    */ 
    protected $firstName; 
} 
+2

對於第二個答案,這並不標誌着字段不爲空,但會驗證這是不是空,如果你運行驗證(例如,如果您在表單中使用它並調用isValid()函數)。但是,如果以某種其他方式創建實體,它仍可能爲空 –

0

對於1

添加

$task->setTaskSet($taskset); 

它不會改變的擁有方,但關係將被保存