2013-04-11 3 views
2

Je fais un projet Symfony2, je créais des entités et j'ai une association ManyToOne et quand j'essaie de ne pas obtenir des données de la base de données que je reçois cette erreur:erreur Doctrine avec la cartographie

The association Ueb\Creator\Bundle\ModuleBundle\Entity\GenericBlock#fields refers to the owning side field Ueb\Creator\Bundle\ModuleBundle\Entity\GenericField#idGenericBlock which is not defined as association. 
The association Ueb\Creator\Bundle\ModuleBundle\Entity\GenericBlock#fields refers to the owning side field Ueb\Creator\Bundle\ModuleBundle\Entity\GenericField#idGenericBlock which does not exist. 

J'ai de cette classe:

GenericField

/** 
    * GenericField 
    * 
    * @ORM\Table(name="crt_generic_field") 
    * @ORM\Entity(repositoryClass="Ueb\Creator\Bundle\ModuleBundle\Entity\Repository\GenericFieldRepository") 
*/ 
class GenericField 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_generic_block") 
* @ORM\ManyToOne(targetEntity="Ueb\Creator\Bundle\ModuleBundle\Entity\GenericBlock", inversedBy="fields") 
* @ORM\JoinColumn(name="id_generic_block", referencedColumnName="id",nullable=false) 
*/ 
private $idGenericBlock; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_field_type") 
* @ORM\ManyToOne(targetEntity="Ueb\Creator\Bundle\ModuleBundle\Entity\FieldTypes") 
* @ORM\JoinColumn(name="id_field_type", referencedColumnName="id",nullable=false) 
*/ 
private $idFieldType; 

/** 
* @var integer 
* 
* @ORM\Column(name="isRequired", type="integer") 
*/ 
private $isRequired; 

/** 
* @var string 
* 
* @ORM\Column(name="field_name", type="string", length=40) 
*/ 
private $fieldName; 

/** 
* @var integer 
* 
* @ORM\Column(name="position", type="integer") 
*/ 
private $position; 

/** 
* @var string 
* 
* @ORM\Column(name="field_description", type="string", length=255) 
*/ 
private $fieldDescription; 

/** 
* @var array 
* 
* @ORM\Column(name="adicional_info", type="array") 
*/ 
private $adicionalInfo; 

Et ma classe GenericBlock

/** 
* GenericBlock 
* 
* @ORM\Table(name="crt_generic_block") 
* @ORM\Entity(repositoryClass="Ueb\Creator\Bundle\ModuleBundle\Entity\Repository\GenericBlockRepository") 
*/ 
class GenericBlock 
{ 

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="blockName", type="string", length=40) 
* 
*/ 
private $blockName; 

/** 
* @var string 
* 
* @ORM\Column(name="itemBlockName", type="string", length=40) 
*/ 
private $itemBlockName; 

/** 
* @var string 
* 
* @ORM\Column(name="blockDescription", type="string", length=255) 
*/ 
private $blockDescription; 

/** 
* @var \DateTime 
* 
* @ORM\Column(name="createdAt", type="date") 
*/ 
private $createdAt; 

/** 
* @var integer 
* 
* @ORM\Column(name="createdBy") 
* @ORM\ManyToOne(targetEntity="Ueb\Accounts\Bundle\UserBundle\Entity\User") 
* @ORM\JoinColumn(name="createdBy", referencedColumnName="id",nullable=true) 
* 
*/ 
private $createdBy; 


/** 
* @var ArrayCollection 
* 
* @ORM\OneToMany(targetEntity="Ueb\Creator\Bundle\ModuleBundle\Entity\GenericField", mappedBy="idGenericBlock", cascade={"all"}) 
*/ 
private $fields; 

J'ai vu quelques questions avec la même erreur et essayé les réponses suggérées mais aucune ne fonctionne donc je ne sais pas quoi faire d'autre, ce doit être une erreur stupide.

Répondre

9

C'était il y a quelque temps mais j'ai conclu que @Column et @JoinColumn ne peuvent pas être utilisés ensemble. Si votre fichier est en relation, vous devez omettre @Column là. Par exemple:

/** 
* @var integer 
* 
* @ORM\Column(name="id_generic_block") <--- ***remove this*** 
* @ORM\ManyToOne(targetEntity="Ueb\Creator\Bundle\ModuleBundle\Entity\GenericBlock", inversedBy="fields") 
* @ORM\JoinColumn(name="id_generic_block", referencedColumnName="id",nullable=false) 
*/ 
private $idGenericBlock; 

Hope this helps ...

+0

Merci, cela a résolu mon problème. Je ne savais pas que je pouvais seulement avoir une des annotations. :) – patricia

1

est très important que vous compreniez que lorsque vous utilisez Doctrine 2, vous devez mapper les relations avec les objets, vous devez penser la conception de vos entités de manière orientée objet (pas de manière relationnelle), en utilisant des compositions et des agrégations pour faire les relations d'objet. Je vous recommande fortement de lire la documentation de Doctrine 2.

Par exemple, GenericField devrait ressembler à ceci:

/** 
* GenericField 
* 
* @ORM\Table(name="crt_generic_field") 
* @ORM\Entity(repositoryClass="Ueb\Creator\Bundle\ModuleBundle\Entity\Repository\GenericFieldRepository") 
*/ 
class GenericField 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var Ueb\Creator\Bundle\ModuleBundle\Entity\GenericBlock 
    * 
    * @ORM\ManyToOne(targetEntity="Ueb\Creator\Bundle\ModuleBundle\Entity\GenericBlock", inversedBy="fields") 
    * @ORM\JoinColumn(name="id_generic_block", referencedColumnName="id",nullable=false) 
    */ 
    private $genericBlock; 

    /** 
    * @var Ueb\Creator\Bundle\ModuleBundle\Entity\FieldTypes 
    * 
    * @ORM\ManyToOne(targetEntity="Ueb\Creator\Bundle\ModuleBundle\Entity\FieldTypes") 
    * @ORM\JoinColumn(name="id_field_type", referencedColumnName="id",nullable=false) 
    */ 
    private $fieldType; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="isRequired", type="integer") 
    */ 
    private $isRequired; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="field_name", type="string", length=40) 
    */ 
    private $fieldName; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="position", type="integer") 
    */ 
    private $position; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="field_description", type="string", length=255) 
    */ 
    private $fieldDescription; 

    /** 
    * @var array 
    * 
    * @ORM\Column(name="adicional_info", type="array") 
    */ 
    private $adicionalInfo; 
    ... 
} 

est très important que vous comprenez que GenericField n'a pas a une propriété entière idGenericBlock, mais un objet de classe GenericBlock nommé genericBlock mis en correspondance sur la colonne id_generic_block (même chose avec fieldType).

Oh, j'ai remarqué un autre problème avec votre entité: isRequired doit-il être mappé en tant que boolean? Si adicionalInfo être additionalInfo (je pense que vous êtes hispanique comme moi :))?

Encore une fois, je vous recommande de lire attentivement Doctrine 2 documentation.

+0

Merci pour les conseils, en changeant spécialement le isRequired en booléen :) – patricia

0

Idéalement, vous devez mettre le mappage de relation sur les deux entités.

Exemple

Ma catégorie Entité

/** 
* @ORM\OneToMany(targetEntity="Product", mappedBy="category") 
*/ 
protected $products; 

public function __construct() 
{ 
    $this->products = new ArrayCollection(); 
} 

Mon produit Entité

/** 
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products") 
* @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
*/ 
protected $category; 

et vous devriez même avoir la méthode dans le produit Catégorie Entité

public function __toString() 

Essayez followi ng ce

http://symfony.com/doc/current/book/doctrine.html

regard sur les relations/associations d'entités. Il vous trier

Questions connexes