【问题标题】:Doctrine error with mapping映射的教义错误
【发布时间】:2013-04-03 20:49:43
【问题描述】:

我正在 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
  *
  * @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;

我看到了一些有相同错误的问题,并尝试了建议的答案,但没有一个有效,所以我不知道还能做什么,这一定是一个愚蠢的错误。

【问题讨论】:

    标签: php symfony doctrine-orm mapping


    【解决方案1】:

    这是前段时间,但我得出结论 @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;
    

    希望这会有所帮助...

    【讨论】:

    • 谢谢,这解决了我的问题。我不知道我只能有一个注释。 :)
    【解决方案2】:

    非常重要的是,当您使用 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 的对象映射到列id_generic_block(与fieldType 相同),这一点非常重要。

    哦,我注意到您的实体存在另一个问题:isRequired 是否应该映射为 booleanadicionalInfo 应该是 additionalInfo(我想你和我一样是西班牙裔 :))?

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

    【讨论】:

    • 感谢您的提示,特别将 isRequired 更改为 boolean :)
    【解决方案3】:

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

    例子

    我的类别实体

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

    查看实体关系/关联。它会帮你解决

    【讨论】:

      猜你喜欢
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2011-04-11
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多