Doctrine2-如何更改拥有方,如何设置not null


Doctrine2 - how to change owning side, how to set 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选择任务实体作为拥有方,因此该代码并没有持久化实体之间的关系:

$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');

最后的问题是:

  1. 有没有办法改变拥有方(当然我不能恢复关系)
  2. 如何将taskset_id标记为NOT NULL
  1. 在类TaskSet中,编辑addTask($task)函数并在末尾添加:

    $task->setTaskset($this);

  2. 正如卡洛斯在评论中所说,我最初的帖子并没有真正回答这个问题。必须在JoinColumn定义上使用可为null的属性:

    类任务{/***@var integer$id**@ORM''Column(name="id",type="integer")*@ORM''Id*@ORM''GeneratedValue(策略="AUTO")*/私人$id;

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

初始答案:

  1. 在Task类的$taskset属性上使用Validator,在您的情况下是NotNull验证器

Symfony2文档中的示例:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony'Component'Validator'Constraints as Assert;
class Author
{
    /**
     * @Assert'NotNull()
     */
    protected $firstName;
}

对于1个

添加

$task->setTaskSet($taskset);

它不会更改拥有方,但关系将被保存