主义一对多关系 - "没有指定标识符/主键"

时间:2014-11-23 19:32:50

标签: php mysql entity-framework doctrine many-to-one

Doctrine在FoodDes(很多)和FoodGroup(一个)之间存在简单的双向多对一关系。这两个实体都显示在这里:

/**
 * @ORM\Entity
 * @ORM\Table(name="FOOD_DES")
 */
class FoodDes
{
    public function __construct()
    {
        $this->foodGroup = new ArrayCollection();
    }

    /**
     * @ORM\Id
     * @ORM\Column(name="NDB_No", type="string", length=10)
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="FoodGroup", inversedBy="fdGroupCode")
     * @ORM\JoinColumn(name="FdGrp_Cd", referencedColumnName="FdGrp_CD")
     */
    protected $foodGroup;
}

>

/**
 * @ORM\Entity
 * @ORM\Table(name="FD_GROUP")
 */
class FoodGroup
{

    /**
     * @ORM\Id();
     * @ORM\GeneratedValue(strategy="NONE");
     * @ORM\OneToMany(targetEntity="FoodDes", mappedBy="foodGroup")
     */
    protected $fdGroupCode;

当我运行doctrine orm:schema-tool:create时,它失败并出现错误:

  

没有为实体指定标识符/主键   'Acme的\实体\ FoodGroup'。每个实体必须有一个   标识符/主键。

但是,我将$ fdGroupCode标记为我唯一的标识符。


下一步方法

我还尝试在FoodGroup实体上创建一个新的主键$ id,并从FoodGroup上的$ fdGroupCode中删除主键标签。以下是新的FoodGroup实体。

/**
 * @ORM\Entity
 * @ORM\Table(name="FD_GROUP")
 */
class FoodGroup
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="FoodDes", mappedBy="foodGroup")
     */
    protected $fdGroupCode;

当我运行doctrine orm:schema-tool:再次创建时,会产生一个新错误:

  

[学说\ ORM \ ORMException]
  从中引用的列名FdGrp_CD   Acme \ Entities \ FoodDes朝向Acme \ Entities \ FoodGroup不存在。

这个错误没有任何意义。当然它不会存在。我在一个空的数据库上运行它!

从命令行运行会发生这些错误,但在针对数据库查询实体时也会发生这些错误。有人能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

我宁愿从我的一个项目中为您提供OneToMany的工作示例,因此您可以正确地看到差异并格式化代码。如果它不起作用,那么尝试获取一个新的Symfony dist并重新开始。

<?php
// SomeBundle/Entity/Shop/Product.php
namespace SomeBundle\Entity\Shop;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="shop_products")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="bigint")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="ProductItem", mappedBy="product")
     */
    protected $productItem;
}

相关实体:

<?php
// SomeBundle/Entity/Shop/ProductItem.php
namespace SomeBundle\Entity\Shop;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="shop_products_items")
 */
class ProductItem
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="bigint")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="productItem")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    protected $product;
}

由于您的代码不起作用的原因可能很多(名称空间,文件夹结构,列名称等)。这个例子可以运行和测试。试一试:)