我有這樣的關係: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');
:
-
從上面的代碼
輸出
- 有沒有辦法改變擁有方(當然我不能恢復關係)?
- 如何將
taskset_id
標記爲NOT NULL?
$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();
是
對於第二個答案,這並不標誌着字段不爲空,但會驗證這是不是空,如果你運行驗證(例如,如果您在表單中使用它並調用isValid()函數)。但是,如果以某種其他方式創建實體,它仍可能爲空 –