在我成功创建了TaskBundle并在类别和任务之间建立了一对多关系后,现在我正在尝试创建一个具有多对多关系的新TaskBundle。我在这个关系中检查复选框也有问题,但现在它不是主要问题(也许在解决之后)。我删除了所有表,这是TaskBundle使用并尝试创建一个新的,但这里有问题(底部的描述)。
我的任务对象:
<?php
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="tasks")
*/
class Task
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=200)
* @Assert\NotBlank(
* message = "Task is empty"
* )
* @Assert\Length(
* min = "3",
* minMessage = "Task is too short"
* )
*/
protected $task;
/**
* @ORM\Column(type="datetime")
* @Assert\NotBlank()
* @Assert\Type("\DateTime")
*/
protected $dueDate;
/**
* @Assert\True(message = "You have to agree.")
*/
protected $accepted;
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="tasks")
* @ORM\JoinTable(name="categories")
*/
protected $category;
/**
* Constructor
*/
public function __construct()
{
$this->category = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set task
*
* @param string $task
* @return Task
*/
public function setTask($task)
{
$this->task = $task;
return $this;
}
/**
* Get task
*
* @return string
*/
public function getTask()
{
return $this->task;
}
/**
* Set dueDate
*
* @param \DateTime $dueDate
* @return Task
*/
public function setDueDate($dueDate)
{
$this->dueDate = $dueDate;
return $this;
}
/**
* Get dueDate
*
* @return \DateTime
*/
public function getDueDate()
{
return $this->dueDate;
}
/**
* Add category
*
* @param \Acme\TaskBundle\Entity\Category $category
* @return Task
*/
public function addCategory(\Acme\TaskBundle\Entity\Category $category)
{
$this->category[] = $category;
return $this;
}
/**
* Remove category
*
* @param \Acme\TaskBundle\Entity\Category $category
*/
public function removeCategory(\Acme\TaskBundle\Entity\Category $category)
{
$this->category->removeElement($category);
}
/**
* Get category
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getCategory()
{
return $this->category;
}
}
和类别对象
<?php
namespace Acme\TaskBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="categories")
*/
class Category
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=200, unique=true)
* @Assert\NotNull(message="Categories cannot be empty", groups = {"adding"})
*/
protected $name;
/**
* @ORM\ManyToMany(targetEntity="Task", mappedBy="category")
*/
private $tasks;
public function __toString()
{
return strval($this->name);
}
/**
* Constructor
*/
public function __construct()
{
$this->tasks = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
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;
}
/**
* Add tasks
*
* @param \Acme\TaskBundle\Entity\Task $tasks
* @return Category
*/
public function addTask(\Acme\TaskBundle\Entity\Task $tasks)
{
$this->tasks[] = $tasks;
return $this;
}
/**
* Remove tasks
*
* @param \Acme\TaskBundle\Entity\Task $tasks
*/
public function removeTask(\Acme\TaskBundle\Entity\Task $tasks)
{
$this->tasks->removeElement($tasks);
}
/**
* Get tasks
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTasks()
{
return $this->tasks;
}
}
所以,在我提出doctrine:schema:update --force
后,我会收到错误:Table 'symfony.categories' already exists
。我试图删除所有缓存,但同样的问题。有什么想法吗?
唯一的问题是,如果它是m2m关系。
PS :我一直在谷歌寻找这个问题,但没有人回答这个问题。只有问题,但没有正确的答案,问题在哪里以及如何解决。
答案 0 :(得分:15)
看起来您已在该数据库中拥有名为“categories”的表。删除此行@ORM\JoinTable(name="categories")
并尝试不使用它。
P.S。 “类别”实际上是连接表的奇怪名称。您应该遵循一些约定,并让学说命名。连接表的通用名称为category_task
或category2task
,因为它们更加不言自明。没有什么 重要,只是试图建议我认为是好的做法。
答案 1 :(得分:7)
问题在于,学说不了解应该如何使用现有表。但你可以给他一些帮助。
您有两种选择:
您不关心现有表格:简单,您可以删除@ORM\JoinTable(name="categories")
注释,而学说会创建其他表格等。
您希望保留现有的表,这听起来很合理:您必须通过添加@ORM\JoinColumn
注释在注释中更明确。
以下是一个例子:
class
<?php
...
/**
* @ORM\Entity
* @ORM\Table(name="tasks")
*/
class Task
{
...
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="tasks")
* @ORM\JoinTable(name="categories",
* joinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="task_id", referencedColumnName="id")})
*/
protected $category;
...
}
和类别对象
<?php
...
/**
* @ORM\Entity
* @ORM\Table(name="categories")
*/
class Category
{
...
/**
* @ORM\ManyToMany(targetEntity="Task", mappedBy="category")
* @ORM\JoinTable(name="categories",
* joinColumns={@ORM\JoinColumn(name="task_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")})
*/
private $tasks;
...
这样做,你就可以保持你的表没有任何学说错误。
答案 2 :(得分:3)
就我所知,我对此的解决方案是表名称的区分大小写问题。 Doctrine让我创建了一个Users
和一个users
表,但之后会死于迁移:差异或迁移:迁移。
我使用-vvv选项获取有关此错误消息的更多详细信息;似乎当Doctrine加载其当前数据库模式的内部表示时发生错误。因此,如果您当前的数据库具有Doctrine不理解的表名(如两个相同的表,不区分大小写),那么它将以这种方式爆炸。
似乎上面的大多数答案都假设错误在您的代码中,但在我的情况下,它在数据库中。
答案 3 :(得分:0)
还有另一个使用表名,您可以在项目中搜索它。 Maby是演示,我认为...... 对不起我的中文英文!
答案 4 :(得分:0)
尝试删除代理目录中的所有内容。
答案 5 :(得分:0)
我在检查每个捆绑包上的其他实体后修复了同样的问题,请注意这一点。
答案 6 :(得分:0)
在Symfony4.1
中,您可以使用迁移版本强制迁移
doctrine:migrations:execute <migration version>
ex
用于迁移version123456.php
使用
doctrine:migrations:execute 123456
答案 7 :(得分:0)
我遇到了这个错误,因为2 ManyToMany定位到同一实体(以下示例中的用户)。
要创建表名原则,请使用实体和目标实体名称。
所以在我的情况下,它试图创建两次表thread_user
调试起来很容易。只需使用'@ORM \ JoinTable'批注并指定表名即可。
这里是一个工作实例。
/**
* @ORM\ManyToMany(targetEntity="App\Entity\User")
* @ORM\JoinTable(name="thread_participant")
*/
private $participants;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\User")
* @ORM\JoinTable(name="thread_recipient")
*/
private $recipients;