多对多关系,双向,但我无法编辑任务

时间:2018-01-02 19:13:25

标签: symfony doctrine many-to-many associations

我与实体一起训练并为我的实体生成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实体时,我就有了相反的情况。

2 个答案:

答案 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以及removeCategoryaddTask方法:

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);
    }
}