2013-04-11 23 views
2

我做的Symfony2中的一个项目,我创建实体和我有一个多对一的关联,当我尝试做从数据库中获取数据,我得到这个错误:主义错误与测绘

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. 

我有这个类的:

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; 

而且我的课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; 

我已经看到一些问题与相同的错误,并尝试建议的答案,但没有工作,所以我不知道还有什么要做,它必须是一个愚蠢的错误。

回答

9

这是前段时间,但我的结论是@Column@JoinColumn不能一起使用。如果你的档案是关系,你应该在那里省略@Column。例如:

/** 
* @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; 

希望这有助于...

+0

谢谢,这解决了我的问题。我不知道我只能有一个注释。 :) – patricia 2013-04-12 09:04:02

1

是非常重要的,你知道,当你使用Doctrine 2,你需要地图对象的关系,你需要考虑你的实体设计以面向对象的方式(而不是关系方式)使用组合和聚合来创建对象关系。我强烈建议您阅读Doctrine 2文档。

例如,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 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; 
    ... 
} 

是非常重要的,你明白GenericField不具有idGenericBlock整数属性,但名为genericBlockGenericBlock类的对象对列id_generic_block映射(与fieldType相同)。

哦,我注意到你的实体的另一个问题:应该isRequired被映射为boolean?应该adicionalInfoadditionalInfo(我认为你是像我一样的西班牙裔:))?

再次,我建议您仔细阅读Doctrine 2 documentation

+0

谢谢你的提示,特别改变isRequired to boolean :) – patricia 2013-04-12 09:06:21

0

理想情况下,您应该将关系映射放在两个实体上。

我的类别实体

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

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

我的产品实体

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

,你甚至应该有分类实体

public function __toString() 

尝试followi方法NG这个

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

看看实体关系/协会。它会排序你