2015-09-30 5 views
2

Je suis nouveau à la doctrine et je suis resté coincé. Toute aide serait appréciée. J'ai créé deux entités: Tâche et Groupe avec une relation plusieurs à plusieurs avec le groupe étant le côté propriétaire. J'ai essayé de les persister. La tâche est conservée, mais le groupe jette une exception SQL.Doctrine 2 Mappage - De nombreuses exceptions à Thows en essayant de persister à posséder le côté

Voici le code pour Task.php:

<?php 

namespace AppBundle\Entity; 

/** 
* Task 
*/ 
class Task 
{ 
/** 
* @var integer 
*/ 
private $id; 

/** 
* @var string 
*/ 
private $task; 

/** 
* @var \DateTime 
*/ 
private $dueDate; 

/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $groups; 

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->groups = 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 group 
* 
* @param \AppBundle\Entity\Group $group 
* 
* @return Task 
*/ 
public function addGroup(\AppBundle\Entity\Group $group) 
{ 
    $this->groups[] = $group; 

    return $this; 
} 

/** 
* Remove group 
* 
* @param \AppBundle\Entity\Group $group 
*/ 
public function removeGroup(\AppBundle\Entity\Group $group) 
{ 
    $this->groups->removeElement($group); 
} 

/** 
* Get groups 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getGroups() 
{ 
    return $this->groups; 
} 
} 

cartographie des tâches

AppBundle\Entity\Task: 
    type: entity 
    table: task 
    id: 
    id: 
    type: integer 
    generator: { strategy: AUTO } 
    fields: 
    task: 
     type: string 
     length: 256 
    dueDate: 
     type: date 
    manyToMany: 
    groups: 
     targetEntity: Group 
     mappedBy: tasks 

Group.php

<?php 

    namespace AppBundle\Entity; 

    /** 
    * Group 
    */ 
    class Group 
    { 
     /** 
     * @var integer 
     */ 
     private $id; 

     /** 
     * @var string 
     */ 
     private $name; 


     /** 
     * Get id 
     * 
     * @return integer 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * Set name 
     * 
     * @param string $name 
     * 
     * @return Group 
     */ 
     public function setName($name) 
     { 
      $this->name = $name; 

      return $this; 
     } 

     /** 
     * Get name 
     * 
     * @return string 
     */ 
     public function getName() 
     { 
      return $this->name; 
     } 
     /** 
     * @var \Doctrine\Common\Collections\Collection 
     */ 
     private $tasks; 

     /** 
     * Constructor 
     */ 
     public function __construct() 
     { 
      $this->tasks = new \Doctrine\Common\Collections\ArrayCollection(); 
     } 

     /** 
     * Add task 
     * 
     * @param \AppBundle\Entity\Task $task 
     * 
     * @return Group 
     */ 
     public function addTask(\AppBundle\Entity\Task $task) 
     { 
      $this->tasks[] = $task; 

      return $this; 
     } 

     /** 
     * Add tasks 
     * 
     * @param array 
     * 
     * @return Group 
     */ 
     public function addTasks(array $tasks) 
     { 
      foreach ($tasks as $task) { 
       if (is_a($task, 'AppBundle\Entity\Task')) { 
        $this->tasks[] = $task; 
       } 
      } 
      return $this; 
     } 

     /** 
     * Remove task 
     * 
     * @param \AppBundle\Entity\Task $task 
     */ 
     public function removeTask(\AppBundle\Entity\Task $task) 
     { 
      $this->tasks->removeElement($task); 
     } 

     /** 
     * Get tasks 
     * 
     * @return \Doctrine\Common\Collections\Collection 
     */ 
     public function getTasks() 
     { 
      return $this->tasks; 
     } 
    } 

cartographie Groupe

AppBundle\Entity\Group: 
     type: entity 
     table: group 
     id: 
     id: 
      type: integer 
      generator: { strategy: AUTO } 
     fields: 
     name: 
      type: string 
     manyToMany: 
     tasks: 
      targetEntity: Task 
      inversedBy: groups 
      cascade: ['persist', 'remove'] 

Le contrôleur

class DoctrineController extends Controller 
{ 
    /** 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function setupAction() 
    { 
     $group = new Group(); 
     $em = $this->getDoctrine()->getManager(); 

     $tasks = $em->getRepository('AppBundle:Task')->findAll(); 
     $group->setName('personal'); 
     $group->addTasks($tasks); 
     $em->persist($group); 
     $em->flush(); 

     echo 'success'; 

     return $this->render('AppBundle:Doctrine:setup.html.twig', array(
     )); 
    } 
} 

L'exception:

An exception occurred while executing 'INSERT INTO group (name) VALUES (?)' with params ["personal"]: 

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group (name) VALUES ('personal')' at line 1 

Je pense qu'il a à faire avec des contraintes de table, mais je ne savoir comment le réparer. Je suis presque sûr qu'il y a un défaut dans ma logique. Si quelqu'un peut me diriger dans la bonne direction avec une solution rapide et une explication/un lien vers un article expliquant pourquoi cela fonctionne comme ça, je serai très reconnaissant.

+2

Vous utilisez un mot réservé comme nom de table 'group' et comme doctrine n'échappe pas au nom, vous obtenez cette erreur. – Artamiel

Répondre

0

De la documentation Symfony http://symfony.com/doc/current/book/doctrine.html#add-mapping-information

Veillez à ce que votre nom de classe et les propriétés ne sont pas mis en correspondance avec un mot-clé SQL protégé (comme groupe ou utilisateur). Par exemple, si votre nom de classe d'entité est Groupe, votre nom de table sera par défaut le groupe , ce qui entraînera une erreur SQL dans certains moteurs. Voir la documentation de Doctrine réservée aux mots-clés SQL sur la façon d'échapper correctement ces noms . Alternativement, si vous êtes libre de choisir votre schéma de base de données, correspond simplement à un nom de table ou de colonne différent. Voir la documentation de Doctrine Création de classes pour la base de données et la documentation de mappage de propriété.

Consultez la documentation Doctrine des conseils sur la façon de citer ces mots réservés: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words

Mais après tout, il est conseillé de ne pas utiliser des mots réservés dans votre classe ou en classe des noms d'attributs.

+1

Merci beaucoup, celui-là est passé par-dessus ma tête. J'ai l'impression de m'être cogné l'orteil juste au moment où je marchais. –