我开始学习 Doctrine 并尝试使用外键在两列之间创建关系。在我的示例中,该关系应该在一个表内实现。这是我的
Entity
课程:
#[ORM\Entity(repositoryClass: BranchRepository::class)]
#[ORM\Table(name: "tst_branches")]
class Branch
{
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'integer')]
#[ORM\ManyToOne(
targetEntity: Branch::class,
inversedBy: 'id'
)]
private int $parent_id;
}
然后我使用以下方法创建数据库结构:
bin/console doctrine:schema:create
结果,我看到了预期的两列,但没有外键来链接
parent_id
和 id
列。
在数据库结构中创建外键应该改变什么?
预期结果应如下所示
要创建此结构,应修复以下问题:
OneToMany
和ManyToOne
)ManyToOne
应该描述一个关系对象,而不是列。 Doctrine 会自动创建所需的列$parent
名称代替 $parent_id
就足够了。 Doctrine 会自动添加 _id
后缀。如果相关列不是 id
,请描述为 ORM\JoinColumn(name: 'parent_id', referencedColumnName: 'root_id')
最终结果是:
#[ORM\Entity(repositoryClass: BranchRepository::class)]
#[ORM\Table(name: "tst_branches")]
class Branch
{
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
#[ORM\Column(type: 'integer')]
#[ORM\OneToMany(
targetEntity: Branch::class,
mappedBy: 'parent'
)]
private int $id;
#[ORM\ManyToOne(
targetEntity: Branch::class,
inversedBy: 'id'
)]
private Branch|null $parent;
}