原则一对多关系 - “未指定标识符/主键”


Doctrine one-to-many relation - "No identifier/primary key specified"

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''Entities''FoodGroup'.每个实体都必须有一个 标识符/主键。

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


下一个方法

我还尝试在 FoodGroup

实体上创建新的主键$id,并从 FoodGroup 上的$fdGroupCode中删除主键标签。以下是新的食品集团实体。

/**
 * @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:create时,它会导致一个新错误:

[Doctrine''ORM''ORMException]
FdGrp_CD引用关系的列名 Acme''Entities''FoodDes towards Acme''Entities''FoodGroup 不存在。

此错误没有任何意义。当然不会存在。我正在针对一个空数据库运行它!

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

我宁愿给你一个项目中OneToMany的工作示例,这样你就可以正确地看到差异和格式化代码。如果它不起作用,那么尝试获得一个新的Symfony并重新开始。

<?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;
}

由于代码不起作用的原因可能很多(命名空间、文件夹结构、列名等)。此示例有效并经过测试。试一试:)