Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 多对多关系,双向,但我无法编辑任务的类别_Symfony_Doctrine_Many To Many_Associations - Fatal编程技术网

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

Symfony 多对多关系,双向,但我无法编辑任务的类别,symfony,doctrine,many-to-many,associations,Symfony,Doctrine,Many To Many,Associations,我正在使用实体进行培训,并为我的实体生成CRUD控制器。我做了任务和类别实体: 类别实体 任务实体 我为那个实体生成了CRUD控制器,它几乎可以正常工作——我可以编辑任务的类别。添加新任务时,我还可以选择0、1或更多类别。但这不是第二条路。当我添加新类别或编辑现有类别时,我可以从“选择”列表中选择0、1或多个类别,我会保存并继续进行,没有例外,但当我签入数据库或仅编辑此类别时,所选任务不匹配。我在数据库中看到了category,但@ORM\JoinTablename=categories\u t

我正在使用实体进行培训,并为我的实体生成CRUD控制器。我做了任务和类别实体:

类别实体

任务实体


我为那个实体生成了CRUD控制器,它几乎可以正常工作——我可以编辑任务的类别。添加新任务时,我还可以选择0、1或更多类别。但这不是第二条路。当我添加新类别或编辑现有类别时,我可以从“选择”列表中选择0、1或多个类别,我会保存并继续进行,没有例外,但当我签入数据库或仅编辑此类别时,所选任务不匹配。我在数据库中看到了category,但@ORM\JoinTablename=categories\u tasks没有新行。我认为它与@ORM\JoinTablename=categories\u tasks有关,因为当我将代码的这一部分移动到Category实体时,情况正好相反。

我认为您需要正确设置addCategory、removeCategory和addTask、removeTask方法:

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

这里的任务实体是关系所有者。它在类中具有inversedBy注释,这就是为什么向任务添加类别,然后保存会将类别保存到关系中。对于要设置关系的类别,您需要遍历任务并让它们设置类别的id,然后保存任务


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

但它不是第二种方法。当我添加新类别或编辑现有类别时,我可以从选择列表中选择0、1或更多类别,我保存您的意思是说我选择0、1更多任务吗?既然你是用另一种方式来描述……谢谢。当我使用双向关系时,我认为它将使任务和类别等效,这意味着我将轻松管理这两种类型。也许你现在知道,如果有其他类型的关联,它不会设置集合二的所有者?不,我认为这是不可能的。请看这里,它提到拥有方甚至存在于多对多中,关系所有者是唯一可以修改关系的人。不工作没有错误,但在编辑类别时我仍然无法保存任务。您确定控制器中不需要其他代码吗?控制器应该如何知道如何从类别添加新/编辑表单保存任务?我假设您使用Symfony表单组件,例如,类别字段是EntityType。TaskForm示例:$builder->addcategories,EntityType::class,array class=>Category::class,choice_label=>name,multiple=>true-如果实体配置正确,则应自动处理任务类别之间的n:m关系。
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);
    }
}
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);
    }
}