【问题标题】:Doctrine one-to-many relation - "No identifier/primary key specified"Doctrine 一对多关系 - “未指定标识符/主键”
【发布时间】:2014-11-23 19:32:50
【问题描述】:

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;

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

没有为实体指定标识符/主键 'Acme\Entities\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;

当我再次运行学说 orm:schema-tool:create 时,会出现一个新错误:

[教义\ORM\ORMException]
列名 FdGrp_CD 引用的关系来自 Acme\Entities\FoodDes 对 Acme\Entities\FoodGroup 不存在。

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

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

【问题讨论】:

  • 我从未见过这样的声明:@ORM\Id();。也许@ORM\Id,不带括号?
  • 谢谢,但这是一回事。我都试过了

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


【解决方案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;
}

您的代码无法运行的原因可能有很多(命名空间、文件夹结构、列名等)。此示例有效并经过测试。试试看:)

【讨论】:

  • 哇,非常感谢。如果没有你的帮助,我不会这样做。我只是回到 Eloquent。我很想给你投票,但我没有足够的声誉。
  • 如果我错了,请纠正我,但似乎 $productItem 实际上并不代表数据库列。相反,$id 是数据库列
  • 没错! $productItem 只是一个链接,它显示了 Doctrine 和你以及这些实体是如何连接在一起的。教义有时会很可怕,但一旦你掌握了基础知识,生活就会变得更轻松。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多