0

我有这样的关系:

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 选择 Task 实体作为拥有方,因此此代码不会保持实体之间的关系:

$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?
4

2 回答 2

2
  1. 在 TaskSet 类中,编辑 addTask($task) 函数并在末尾添加:

    $task->setTaskset($this);

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

    class Task { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="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;
}
于 2012-08-31T13:34:26.597 回答
0

为 1

添加

$task->setTaskSet($taskset);

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

于 2012-08-31T13:27:25.917 回答