我正在使用实体进行训练并为我的实体生成 CRUD 控制器。我做了任务和类别实体:
类别实体
<?php
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Category
*
* @ORMTable(name="category")
* @ORMEntity(repositoryClass="AppBundleRepositoryCategoryRepository")
*/
class Category
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="name", type="string", length=255)
*/
private $name;
/**
* @ORMManyToMany(targetEntity="Task", mappedBy="categories")
*/
private $tasks;
public function __construct() {
$this->tasks = new DoctrineCommonCollectionsArrayCollection();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Category
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
public function getTasks()
{
return $this->tasks;
}
public function setTasks(Task $task)
{
$this->tasks = $task;
}
public function __toString() {
return $this->name;
}
}
?>
任务实体
<?php
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Task
*
* @ORMTable(name="task")
* @ORMEntity(repositoryClass="AppBundleRepositoryTaskRepository")
*/
class Task
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="name", type="string", length=255)
*/
private $name;
/**
* @var DateTime
*
* @ORMColumn(name="datetime", type="datetime")
*/
private $datetime;
/**
* @ORMManyToMany(targetEntity="Category", inversedBy="tasks")
* @ORMJoinTable(name="categories_tasks")
*/
private $categories;
public function __construct() {
$this->categories = new DoctrineCommonCollectionsArrayCollection();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Task
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set datetime
*
* @param DateTime $datetime
*
* @return Task
*/
public function setDatetime($datetime)
{
$this->datetime = $datetime;
return $this;
}
/**
* Get datetime
*
* @return DateTime
*/
public function getDatetime()
{
return $this->datetime;
}
public function getCategories()
{
return $this->categories;
}
public function setCategories(Category $categories)
{
$this->categories = $categories;
}
public function __toString() {
return $this->name;
}
}
?>
我为该实体生成了 CRUD 控制器,它几乎可以正常工作 - 我可以编辑任务的类别。当我添加新任务时,我还可以选择 0、1 或多个类别。但它不是以第二种方式工作的。当我添加新类别或编辑现有类别时,我可以从选择列表中选择 0、1 或多个类别,我"保存"并且它无一例外地走得更远,但是当我签入数据库或只是编辑此类别时,选择的任务不匹配。我在数据库中看到了类别@ORMJoinTable(name="categories_tasks")
但没有新行。我认为它与@ORMJoinTable(name="categories_tasks")
有关,因为当我将这部分代码移动到实体Category
时,我遇到了相反的情况。
这里的任务实体是关系所有者(它在类中具有 inversedBy 注释(,这就是为什么将类别添加到任务然后保存将类别保存到关系中的原因。要使类别设置关系,您需要循环访问任务并让它们设置类别的 id,然后保存任务。
不确定是否有更好的解决方案。但我对自己对问题的诊断充满信心。
我认为您需要正确设置addCategory
,removeCategory
以及addTask
,removeTask
方法:
任务.php
public function addCategory(Category $category)
{
if (!$this->categories->contains($category)) {
$this->categories->add($category);
$category->addTask($this);
}
}
public function removeCategory(Category $category)
{
if ($this->categories->contains($category)) {
$this->categories->remove($category);
$category->removeTask($this);
}
}
类别相同.php
public function addTask(Task $task)
{
if (!$this->tasks->contains($task)) {
$this->tasks->add($task);
$task->addCategory($this);
}
}
public function removeTask (Task $task)
{
if ($this->tasks->contains($task)) {
$this->tasks->remove($task);
$task->removeCategory($this);
}
}