如何使用 Doctrine 创建外键

问题描述 投票:0回答:1

我开始学习 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
列。

在数据库结构中创建外键应该改变什么?

预期结果应如下所示

php doctrine-orm doctrine foreign-keys
1个回答
0
投票

要创建此结构,应修复以下问题:

  • 将属性视为数据对象,而不是数据库中的表列。描述数据关系,Doctrine 将创建所需的数据库结构。
  • 在这种情况下,应该从两个方向描述关系(
    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;
}
© www.soinside.com 2019 - 2024. All rights reserved.