我正在Symfony2中创建一个项目,我正在创建实体,我有一个ManyToOne关联,当我尝试从数据库中获取数据时,我收到此错误:
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;
我已经看到了一些带有相同错误的问题并尝试了建议的答案,但没有工作,所以我不知道还能做什么,这一定是个愚蠢的错误。
答案 0 :(得分: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;
希望这会有所帮助......
答案 1 :(得分: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
整数属性,但是GenericBlock
的对象名为genericBlock
,映射在列{{1}上(与id_generic_block
相同)。
哦,我注意到您的实体存在另一个问题:fieldType
应该映射为isRequired
吗? boolean
adicionalInfo
应该是additionalInfo
(我觉得你像我一样是西班牙人:))?
我再次建议您仔细阅读Doctrine 2 documentation。
答案 2 :(得分: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()
试试这个
http://symfony.com/doc/current/book/doctrine.html
查看实体关系/关联。它会把你排除在外