Doctrine2 - 如何改变拥有方,如何设置不为null

时间:2012-08-31 13:23:03

标签: php doctrine-orm

我有这样的关系:

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)

由于现在一切顺利,我得到一个(testset)到许多(测试)双向关系。

不幸的是,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?

2 个答案:

答案 0 :(得分:2)

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

    $任务 - > setTaskset($此);

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

    课程任务 {     / **      * @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;
    

  3. 初步答复:

    1. 在Task类的$ taskset属性中使用Validator(在您的情况下为NotNull验证程序。)
    2. Symfony2文档中的示例:

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

答案 1 :(得分:0)

1

添加

$task->setTaskSet($taskset);

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