如何添加可为 null 的一对多 FK



我正在尝试两个实体A和B之间的ManyToOne的基本关系。实体 A 已被声明,因此实际迁移包含实体 B 的创建以及以某种方式更改 A 以接受外键。我在这里也遇到了一个问题:无法在 JoinColumn 中为 Symfony2/Doctrine 中的外键引用定义列类型(PK 为 A bigint,cannot add foreign key错误(。

修复了这个问题,只有当我也删除实体 A 并基本上从头开始创建它们时,它才有效。 我的代码和迁移仅创建 B 并更改 A(仍然会导致错误(: 不知何故,我希望 A 中的 FK 也接受可空值,我认为问题在于:

这是第一次迁移:

CREATE TABLE
A(id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
name VARCHAR(255) NOT NULL,
description VARCHAR(255) NOT NULL,
value VARCHAR(255) NOT NULL,
datatype VARCHAR(255) NOT NULL,
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB

现在基于我的代码,正在生成以下查询:

CREATE TABLE 
B(id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
name VARCHAR(255) NOT NULL,
code INT UNSIGNED NOT NULL,
UNIQUE INDEX code_idx (code),
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB

和:

ALTER TABLE
A(table) ADD CONSTRAINT FK_D1DD32EBBF396750 FOREIGN KEY (id) REFERENCES B(table) (id)

但是当我运行迁移时,A 表中没有放置任何列。我真的很困惑,不知道该怎么解决这个问题。有没有人有一些线索?

编辑:

我在实体中的代码是:

class A:
/**
* @var B
*
* @ORMManyToOne(targetEntity="AppModelB", inversedBy="aS")
* @ORMJoinColumn(name="id", referencedColumnName="id")
*/
private $bId;
class B:
/**
* @var integer
*
* @ORMColumn(name="id", type="bigint", nullable=false, options={"unsigned": true})
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORMOneToMany(targetEntity="AppModelA", mappedBy="bid")
*/
private $aS;

你的映射有点缺陷(或者你实际上打算这样做(
这是你的代码固定的

<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(name="a")
* @ORMEntity(repositoryClass="AppRepositoryARepository")
*/
class A
{
/**
* @var B
*
* @ORMManyToOne(targetEntity="B", inversedBy="aS")
* @ORMJoinColumn(name="id", referencedColumnName="id")
* @ORMId
*/
private $bId;
}

这是首选的解决方案

<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(name="a")
* @ORMEntity(repositoryClass="AppRepositoryARepository")
*/
class A
{
/**
* @var integer
*
* @ORMColumn(name="id", type="bigint", options={"unsigned": true})
* @ORMId
* @ORMGeneratedValue(strategy="auto")
*/
private $id;
/**
* @var B
*
* @ORMManyToOne(targetEntity="B", inversedBy="aS")
* @ORMJoinColumn(name="b_id", referencedColumnName="id")
*/
private $b;
}

在您的 A 实体中,您实际上映射对象 B 而不是其 ID

最新更新