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

问题描述 投票:0回答:2

我正在训练实体并为我的实体生成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控制器,它工作得很好 - 我可以编辑任务的类别。当我添加新任务时,我也可以选择0,1个或更多类别。但它不是第二种方式。当我添加新类别或编辑已存在时,我可以从选择列表中选择0,1个或更多类别,我“保存”并且它进一步无例外但是当我签入数据库或只是编辑此类别时所选择的任务不匹配。我在数据库中看到了类别,但是@ORM\JoinTable(name="categories_tasks")没有新行。我认为它与@ORM\JoinTable(name="categories_tasks")有关系,因为当我将这部分代码移动到Category实体时,我有相反的情况。

symfony doctrine many-to-many associations
2个回答
1
投票

这里的任务实体是关系所有者(它在类中具有反转的注释),这就是为什么向任务添加类别然后保存将类别保存到关系的原因。对于要设置关系的类别,您需要迭代完成任务并让它们设置类别的ID,然后保存任务。

不确定是否有更好的解决方案。但我对我对这个问题的诊断充满信心。


0
投票

我认为你需要正确设置你的addCategoryremoveCategory以及addTaskremoveTask方法:

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

对于Category.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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.