Symfony2 ManyToMany或OneToMany还是什么?

时间:2014-08-18 07:50:35

标签: php symfony many-to-many one-to-many

我正在尝试大约2周才能运行我的代码。

数据库结构(简化):

表用户 | ID |用户名|

表格任务 | ID |任务标题|任务类型|用户

表格任务类型 | ID |任务类型标题|

表格任务完成 | ID |任务ID |用户ID

我想要的是什么:

添加一个任务,选择任务是否为全局(每个用户都可见),或者是否只有一个用户可以看到任务(全局或用户ID被放入表“任务”表中的“用户”表中。

如果我将任务标记为“已完成”,我想使用任务ID和用户ID进入“任务完成”表(用户ID的值来自页面,其中输入已完成,通常是表“任务”字段“USER”中的值相同,但当任务是“全局”任务时,表“任务完成”中“USER ID”的值不能是“全局”,而是“全局”的ID用户,正在执行此任务。

我尝试了许多方法,包括多对多,一对多等等。但我总是得到错误,有人可以帮助我吗?我已经读过,“ID”字段的表字段名称可能存在一些问题。

也许有人可以告诉我如何设置数据库结构/ entites。 这对我有很大的帮助!

亲切的问候, 马文

编辑1

执行doctrine时出错:schema:在控制台中更新--force。

[Doctrine\DBALDBALException]
An exception occurred while executing 'ALTER TABLE tasks ADD CONSTRAINT
FK_50586597BF396750 FOREIGN KEY (id) REFERENCES task_done (id)':                                                                 

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`seotool`.`#sql-382_38`, CONSTRAINT `FK_50586597BF396750` FOREIGN KEY (`id`) REFERENCES `task_done` (`id`))

[PDOException]    
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`seotool`.`#sql-382_38`, CONSTRAINT `FK_50586597BF396750` FOREIGN KEY (`id`) REFERENCES `task_done` (`id`))    

Code Task.php

<?php

 namespace Seotool\MainBundle\Entity;
 use Doctrine\Common\Collections\ArrayCollection;
 use Symfony\Component\Validator\Constraints as Assert;
 use Doctrine\ORM\Mapping as ORM;

 /**
  * @ORM\Entity
  * @ORM\Table(name="tasks")
  */
 class Task {

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="string")
 */
protected $task_title;

/**
 * @ORM\Column(type="text")
 */
protected $task_description;


/**
 * @ORM\Column(type="string")
 */
protected $task_priority;

/**
 * @ORM\ManyToOne(targetEntity="TaskTypes", inversedBy="task")
 * @ORM\JoinColumn(name="tasktype", referencedColumnName="id")
 */
protected $TaskTypes;

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="task")
 * @ORM\JoinColumn(name="user", referencedColumnName="id")
 */
protected $User;

/**
 * @ORM\ManyToOne(targetEntity="TaskDone", inversedBy="task")
 * @ORM\JoinColumn(name="id", referencedColumnName="id")
 */
protected $TaskDone;

....

代码TaskDone.php

<?php

 namespace Seotool\MainBundle\Entity;

 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Mapping as ORM;

 /**
  * @ORM\Entity
  * @ORM\Table(name="task_done")
  */
 class TaskDone
 {

/**
 * @ORM\OneToMany(targetEntity="Task", mappedBy="TaskDone")
 */
protected $task;

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

.....

1 个答案:

答案 0 :(得分:0)

我无法重新创建您的确切错误但是查看您的已禁用的表结构我通过更改连接列的名称来运行示例...您要求学说创建一个用作外键的列但是表已经包含一个名为id的列。使用name =“task_ id”之类的东西。

你有这个:

/**
 * @ORM\ManyToOne(targetEntity="TaskDone", inversedBy="task")
 * @ORM\JoinColumn(name="id", referencedColumnName="id")
 */
protected $TaskDone;

将其更改为:

/**
 * @ORM\ManyToOne(targetEntity="TaskDone", inversedBy="task")
 * @ORM\JoinColumn(name="task_id", referencedColumnName="id")
 */
protected $TaskDone;

你也有倒退的关系。这将在“任务”表中创建一个提交的task_id,并且您希望在“任务完成”表中创建它。要解决此问题,您应将OnetoMany放在TaskDity上的TaskTity和ManyToOne中。

Doctrine documentation