我有这样的关系:
class TaskSet
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var DoctrineCommonCollectionsArrayCollection $tasks
*
* @ORMOneToMany (targetEntity="Task", mappedBy="taskset", cascade={"ALL"})
*/
private $tasks;
和
class Task
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var TaskSet $taskset
*
* @ORMManyToOne(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选择任务实体作为拥有方,因此该代码并没有持久化实体之间的关系:
$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();
上面代码的输出是:
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
-
在类TaskSet中,编辑addTask($task)函数并在末尾添加:
$task->setTaskset($this);
-
正如卡洛斯在评论中所说,我最初的帖子并没有真正回答这个问题。必须在JoinColumn定义上使用可为null的属性:
类任务{/***@var integer$id**@ORM\Column(name="id",type="integer")*@ORM\Id*@ORM\GeneratedValue(策略="AUTO")*/私人$id;
/** * @var TaskSet $taskset * * @ORMJoinColumn(nullable=false) * @ORMManyToOne(targetEntity="TaskSet", inversedBy="tasks") */ private $taskset;
初始答案:
- 在Task类的$taskset属性上使用Validator,在您的情况下是NotNull验证器
Symfony2文档中的示例:
// src/Acme/BlogBundle/Entity/Author.php
use SymfonyComponentValidatorConstraints as Assert;
class Author
{
/**
* @AssertNotNull()
*/
protected $firstName;
}
对于1个
添加
$task->setTaskSet($taskset);
它不会更改拥有方,但关系将被保存