mysql - 如何添加可以为空的一对多 FK
问题描述
我正在尝试两个实体 A 和 B 之间的 ManyToOne 基本关系。实体 A 已经被声明,因此实际迁移包含实体 B 的创建以及以某种方式更改 A 以接受外键。我也遇到了这里显示的问题:无法在 JoinColumn 中为 Symfony2/Doctrine 中的外键引用定义列类型(具有 A bigint 的 PK,错误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
*
* @ORM\ManyToOne(targetEntity="App\Model\B", inversedBy="aS")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $bId;
class B:
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", nullable=false, options={"unsigned": true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Model\A", mappedBy="bid")
*/
private $aS;
解决方案
您的映射有点缺陷(或者您实际上打算这样做)
这是您的代码已修复
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="a")
* @ORM\Entity(repositoryClass="App\Repository\ARepository")
*/
class A
{
/**
* @var B
*
* @ORM\ManyToOne(targetEntity="B", inversedBy="aS")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
* @ORM\Id
*/
private $bId;
}
这是首选的解决方案
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="a")
* @ORM\Entity(repositoryClass="App\Repository\ARepository")
*/
class A
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", options={"unsigned": true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="auto")
*/
private $id;
/**
* @var B
*
* @ORM\ManyToOne(targetEntity="B", inversedBy="aS")
* @ORM\JoinColumn(name="b_id", referencedColumnName="id")
*/
private $b;
}
在您的 A 实体中,您实际上映射对象 B 而不是它的 ID
推荐阅读
- python - 在 Pyqt5 DESIGN 上显示来自 sqlite 的 BLOB 数据
- javascript - 有没有办法保留每个当前的用户 ID,所以我可以在猫鼬钩子中使用它?
- javascript - 如何使用 Node.js 和 Firebase 制作实时列表
- ssl - Traefik 2.0 TLS TCP 直通
- python - parquet int96时间戳通过python转换为日期时间/日期
- javascript - 使用 jQuery 从类中获取特定的用户数据
- node.js - 如何在 Node.js 中使用 RESTful API
- python - 如何将所有解释变量的多散点图拉到python中的响应变量
- google-apps-script - 如何防止gmail线程回来
- javascript - 在nodejs msnodesqlv8中未执行存储过程查询后的代码