Doctrine ORM index正确用法

时间:2017-10-12 14:54:56

标签: symfony doctrine-orm orm doctrine relational-database

在学说(Symfony)中,我在两个实体之间有一个1-n的关系:一个经理拥有n个企业。

manager_id | business_id
1          | 1
1          | 2
1          | 3

我在设置关系方面没有任何问题,但我对索引设置有一些不清楚的事情

这是我的Manager.orm.yml

Manager:
    //...
    indexes:
       business__index:
          columns: [business_id]

    //...
    manyToOne:
        business:
            targetEntity: Business
            inversedBy: managers
            cascade: ['persist', 'remove']
            orphanRemoval: true
            joinColumn:
                name: business_id
                referencedColumnName: id
                nullable: false

这是我的Business.orm.yml

 Business:
    //...
    oneToMany:
        managers:
            targetEntity: User\ManagerBundle\Entity\Manager
            mappedBy: pharmacyBusiness
            indexBy: business_id # is this correct?

关系的作用以及约束的行为都符合我的意愿。然而,索引已成功创建。

我唯一关心的是条款indexBy,它几​​乎适用于我所投入的任何价值。 我应该使用什么价值?如您所见,我提供了business_id值(索引列),但我不知道是使用business_id还是business__index(索引名称)。无论哪种方式都有效,但我不明白其中的内容:(

1 个答案:

答案 0 :(得分:3)

首先,我不认为你需要business__index定义,因为它是一个外键,所以无论如何RDBMS都会在这个列上创建一个索引。

第二件事是indexBy选项。我不确定你是否明白它的用途。此选项用于在实体中创建indexed association(在PHP级别)。它并没有真正影响数据库架构。

简而言之,如果您希望能够轻松地从集合中获取项目(在您的案例中为managers),您可能希望Doctrine以某种方式映射您的经理,其中每个经理的某些价值是数组中的键(实际上是ArrayIterator),所以你可以像$this->managers[$someId]那样得到它。

由于定义的字段用作键,因此您应该使用唯一的字段。通常是它的主键(在你的情况下为Manager::$id)。

如果没有这个,您需要遍历整个集合以查找具有特定ID的经理。