Symfony2, Doctrine2 - forcer la mise à jour de table existe déjà sur plusieurs-à-plusieurs relation
Après que j'ai réussi à créé TaskBundle avec Un-à-Plusieurs relation entre la catégorie et les tâches, maintenant je suis en train de créer un nouveau TaskBundle avec plusieurs-à-Plusieurs. Je reçois aussi des problème avec la vérification de case à cocher dans cette relation, mais maintenant, il n'est pas un problème primaire (peut-être après la résolution de ce). J'ai supprimé toutes les tables, ce qui est TaskBundle aide et d'essayer de créer un nouveau, mais ici, c'est le problème (description en bas).
Ma Tâche de l'objet:
<?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;
}
}
et de la Catégorie de l'objet
<?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;
}
}
Donc, après j'ai mis doctrine:schema:update --force
je vais d'erreur: Table 'symfony.categories' already exists
. J'ai essayé de supprimer tous les caches, mais même problème. Une idée?
Il n'y a qu'problème, si c'est comme m2m relation.
PS: j'étais à la recherche de ce problème à Google, mais personne ne répond à ce problème. Il n'y avait que des questions, mais pas les bonnes réponses, où est le problème et comment le résoudre.
doctrine:schema:update --dump-sql
puis en exécutant SQL directement dans la base de données et voir si elle pourrait éventuellement être mal formé SQL et il est juste de ne pas jeter une exception? Long shot, mais au moins qui se rétrécit vers le bas un peu.Hannel: même message: [Doctrine\DBAL\Schema\SchemaException] Le tableau avec le nom " symfony.catégories' existe déjà. doctrine:schema:update [ - ] [--dump-sql] [--force] [--em[="..."]]
malheureusement, l'erreur se produit avant que le sql est entièrement créé afin de dump-sql n'aide pas vraiment.
OriginalL'auteur Bc. Poklop | 2013-09-28
Vous devez vous connecter pour publier un commentaire.
Ressemble vous avez déjà de table nommée "catégories" dans la base de données. Supprimer cette ligne
@ORM\JoinTable(name="categories")
et essayez sans.P. S. "Catégories" est vraiment un nom étrange pour table de jointure. Vous devriez probablement faire de certaines conventions et de laisser la doctrine nom. Noms communs pour les tables de jointure sont
category_task
oucategory2task
car ils sont plus explicites. Rien que important, tout en essayant de suggérer ce que je considère comme une bonne pratique.Il sera automatiquement créé par la Doctrine. Parce qu'il sait que c'est une relation ManyToMany et les besoins pour la créer.
ce n'est pas la bonne réponse. Si vous supprimez JoinTable - il va créer plus d'une table avec une Relation manyToMany.
Il permettra de créer de la table de jointure et le nom automatiquement par la convention. Dans son cas, il sera nommé "category_task".
Vous ne devriez jamais avoir posséder deux côtés. Choisissez-en un en tant que propriétaire (je ne pense pas que c'est important pour ManyToMany!), et de préciser , inversedBy et mappedBy attributs. Tout comme les docs de l'état: docs.doctrine-project.org/projects/doctrine-orm/en/latest/... . Doctrine se rendre compte que ces deux sont connectés, et de créer un seul JoinTable par la lecture de posséder côté des annotations. \@JoinTable peut être omis, alors.
OriginalL'auteur Igor Pantović
Le truc, c'est que la doctrine n'a pas à comprendre comment votre tableau doit être utilisé. Mais vous pouvez lui donner un peu d'aide.
Vous avez deux options :
Vous n'avez pas de soins sur la table existante : simple, vous pouvez retirer le
@ORM\JoinTable(name="categories")
annotation, et la doctrine va créer une autre table, etc.Vous voulez garder votre table existante, ce qui semble assez logique : vous devez être plus explicite dans votre annotation, en ajoutant
@ORM\JoinColumn
annotation.Voici un exemple:
et de la Catégorie de l'objet
De le faire, vous serez en mesure de garder votre table sans aucune doctrine d'erreur.
mappedBy
sur l'un, tout en ayant lainversedBy
sur l'autre côté.@ORM\JoinTable
est ignoré et totalement inutile sur ne possédant pas de côté (avecmappedBy
bien si je me souviens bien). Par ailleurs, il n'développeur oublier de le mettre à jour dans le deuxième emplacement, donc vous ne devriez pas vraiment lieu deux fois.OriginalL'auteur Ben Tazulev
Mon fix pour cela, autant que je puisse en dire, est une affaire de sensibilité d'un problème avec les noms de table. La Doctrine permettez-moi de créer un
Users
et unusers
table, mais après la mort sur les migrations:diff ou les migrations:migrer .J'ai utilisé l'-vvv option pour obtenir plus de détails sur ce message d'erreur; il semble que l'erreur se produit lors de la Doctrine est le chargement de sa propre représentation interne de la base de données actuelle du schéma. Donc, si votre base de données actuelle a les noms de table que la Doctrine n'a pas à comprendre (comme les deux tables qui sont identiques, non sensible à la casse), puis elle va se faire sauter dans ce mode.
Semble que la plupart des réponses ci-dessus supposent que l'erreur est dans votre code, mais dans mon cas, c'était dans la base de données.
OriginalL'auteur willbradley
il y a une autre en utilisant le nom de la table ,vous pouvez rechercher dans votre projet . Maby être démo,je pense qu'il...
désolé pour mon chinois anglais !
OriginalL'auteur user5164320
Essayer de tout laisser tomber à l'intérieur de votre répertoire de proxy.
OriginalL'auteur zinovyev
- Je fixer le même problème après l'enregistrement d'autres entités sur chacun des faisceaux, d'être conscient de cela.
OriginalL'auteur Jean-Luc Barat
dans
Symfony4.1
vous pouvez forcer la migration à l'aide de la migration de la versionex
pour les migrations
version123456.php
utilisationOriginalL'auteur Sakhri Houssem