2011-11-29 4 views
1

J'ai deux modèles qui sont liés les uns aux autres:clé primaire + clé étrangère avec une erreur en double entrée

/** @Entity @Table(name="permissions") */ 
class Permissions { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    protected $id; 

    /** 
    * @Column(type="string") 
    * @var string 
    */ 
    protected $name; 

    public function getId() { return $this->id; } 

    public function setName($name) { $this->name = $name; } 
    public function getName() { return $this->name; } 
} 

et

/** @Entity @Table(name="permissions_types") */ 
class PermissionsTypes { 
    /** 
    * @Id 
    * @OneToOne(targetEntity="Permissions") 
    * @JoinColumn(name="perm_id", referencedColumnName="id") 
    */ 
    protected $perm; 

    /** 
    * @Id 
    * @Column(type="integer") 
    * @var string 
    */ 
    protected $type; 

    /** 
    * @Column(type="string") 
    * @var string 
    */ 
    protected $name; 

    public function setType($type) { $this->type = $type; } 
    public function getType() { return $this->type; } 

    public function setName($name) { $this->name = $name; } 
    public function getName() { return $this->name; } 
} 

Quand je veux ajouter à PermissionsTypes deux entités avec des valeurs:

perm | type | name 
------------------- 
    1 | 0 | test1 
    1 | 1 | test2 

Je reçois

Duplicate entry '1' for key 'UNIQ_12CF91AFFA6311EF'

erreur sur la 1ère colonne. Ce que je fais mal?

+0

Pouvez-vous faire un 'show create table nom_table' pour la table PermissionsTypes? On dirait que vous avez une clé unique sur la colonne perm, quand elle devrait être à travers perm et le type. –

+0

Oui, j'ai une clé unique sur cette colonne. La question est, comment ça crée? –

+0

Comment avez-vous créé le schéma de la table? À la main, ou a-t-il été généré automatiquement? –

Répondre

1

Plusieurs problèmes ici ...

  1. Vous ne pouvez pas utiliser une entité apparentée comme clé primaire d'une autre entité (@Id)
  2. Vous utilisez une relation one-to-one mais que vous voulez pour en ajouter plus d'un PermissionTypes par Permissions. Cela nécessite une association un-à-plusieurs, de préférence bidirectionnelle.

Ajouter types à Permissions avec

/** 
* @OneToMany(targetEntity="PermissionTypes", mappedBy="perm") 
*/ 
protected $types; 

public function __construct() 
{ 
    $this->types = new \Doctrine\Common\Collections\ArrayCollection; 
    // see http://www.doctrine-project.org/docs/orm/2.1/en/reference/association-mapping.html#collections 
} 

et changer PermissionTypes à

class PermissionsTypes { 

    /** 
    * @Id @GeneratedValue 
    * @Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @ManyToOne(targetEntity="Permissions", inversedBy="types") 
    * @JoinColumn(name="perm_id", referencedColumnName="id") 
    */ 
    protected $perm; 

Vous devriez lire la section Association Mapping du manuel.

+0

1. Je ne comprends pas il. Pourriez-vous l'expliquer plus précisément? 2. J'ai changé "one-to-one" à "manny-to-one" et cela a fonctionné :). –

+0

Vous avez une erreur: [Doctrine \ Common \ Annotations \ AnnotationException] [Erreur de syntaxe] Doctrine attendue \ Common \ Annotations \ DocLexer :: T_CLOSE_PARENTHESIS, obtenu 'mappedBy' à la position 43 dans la propriété Permissions :: $ types. –

+0

@KrzysztofTrzos J'ai manqué quelques virgules dans la cartographie d'annotation, voir ma mise à jour – Phil

Questions connexes