我与实体一起训练并为我的实体生成CRUD控制器。我做了任务和类别实体:
类别实体
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
*/
class Category
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToMany(targetEntity="Task", mappedBy="categories")
*/
private $tasks;
public function __construct() {
$this->tasks = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* 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 AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Task
*
* @ORM\Table(name="task")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TaskRepository")
*/
class Task
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var \DateTime
*
* @ORM\Column(name="datetime", type="datetime")
*/
private $datetime;
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="tasks")
* @ORM\JoinTable(name="categories_tasks")
*/
private $categories;
public function __construct() {
$this->categories = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* 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控制器,它工作得很好 - 我可以编辑Task的类别。当我添加新任务时,我也可以选择0,1个或更多类别。但它没有以第二种方式工作。当我添加新类别或编辑已存在时,我可以从选择列表中选择0,1个或更多类别,我&#34;保存&#34;并且它没有例外,但是当我签入数据库或只是编辑这个类别时,所选择的任务不匹配。我在数据库中看到了类别,但@ORM\JoinTable(name="categories_tasks")
没有新行。我认为它与@ORM\JoinTable(name="categories_tasks")
有关系,因为当我将这部分代码移动到Category
实体时,我就有了相反的情况。
答案 0 :(得分:1)
此处的任务实体是关系所有者(它在类中具有inversedBy注释),这就是为什么向任务添加类别然后保存将类别保存到关系的原因。对于要设置关系的类别,您需要迭代完成任务并让它们设置类别的ID,然后保存任务。
不确定是否有更好的解决方案。但我对我对这个问题的诊断充满信心。
答案 1 :(得分:0)
我认为您需要正确设置ClassWebScrap s1 = new ClassWebScrap();
ClassWebScrap s2 = new ClassWebScrap();
Task taskA = new Task(()=>s1.DoThatFetchThing("address1"));
taskA.Start();
Task taskB = new Task(()=>s2.DoThatFetchThing("address2"));
taskB.Start();
Task.WaitAll(taskA, taskA);
,addCategory
以及removeCategory
,addTask
方法:
Task.php
removeTask
与Category.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);
}
}