2017-10-12 9 views
0

Doctrine(Symfony)では、私は2つのエンティティ間に1-nの関係を持っています。Doctrine ORM indexBy適切な使い方

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? 

関係w orksと制約は私が望むように振る舞います。しかし、索引は正常に作成されます。

私の唯一の関心事は、私が入れた値がほとんどどんな値でも動作する節indexByです。 どのような値を使用すればよいですか?ご覧のとおり、私はbusiness_idの値(インデックス付きの列)を指定しましたが、business_idまたはbusiness__index(インデックス名)を使用するかどうかはわかりません。いずれにしても動作しますが、何が起こっているのかわかりません:

答えて

1

まず、外字キーなのでbusiness__indexの定義は必要ありません.RDBMSはこの列にインデックスを作成します。

2つ目はindexByオプションです。私はあなたがそれが何のためにあるのかを理解します。このオプションは、あなたのエンティティ(PHPレベルで)でindexed associationを作成するために使用されるかわからない。それは本当にDBには影響を与えません。スキーマ

簡単に言えば、コレクションからアイテムを簡単に取得したい場合(あなたの場合はmanagers)、 Doctrineに、各マネージャの値が配列のキー(実際にはArrayIterator)であるような方法でマネージャをマップしたいので、$this->managers[$someId]のようにすることができます。

定義済みのフィールドがキーとして使用されているので、一意のフィールドを使用することは明らかです。通常は主キーです(Manager::$idあなたの場合)。

これがなければ、特定のIDを持つマネージャーを見つけるためにコレクション全体を反復する必要があります。