首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Doctrine2 -如何更改拥有方,如何设置null

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

Stack Overflow用户
提问于 2012-08-31 13:23:03
回答 2查看 327关注 0票数 0

我有这样的关系:

代码语言:javascript
复制
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;

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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作为所有者,因此这段代码没有在实体之间持久化:

代码语言:javascript
复制
$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();

以上代码的输出如下:

代码语言:javascript
复制
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标记为NULL?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-31 13:34:26

  1. 在类TaskSet中,编辑addTask($task)函数并在末尾添加: $task->setTaskset($this);
  2. 正如卡洛斯在评论中所说的,我最初的帖子并没有真正回答这个问题。必须在JoinColumn定义上使用可空属性: 类任务{ /** * @var整型$id **@ORM\列(name=“Id”,type=" integer ") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ strategy= $id; /** * @var TaskSet $taskset ** @ORM\JoinColumn(nullable=false) * @ORM\ManyToOne(targetEntity="TaskSet",inversedBy="tasks") */ inversedBy= $taskset;

初步答覆:

  1. 在任务类的验证器属性上使用NotNull验证器(在您的示例中是NotNull验证器)。

Symfony2 2文档中的示例:

代码语言:javascript
复制
// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    /**
     * @Assert\NotNull()
     */
    protected $firstName;
}
票数 2
EN

Stack Overflow用户

发布于 2012-08-31 13:27:25

为1

添加

代码语言:javascript
复制
$task->setTaskSet($taskset);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12216251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档