2013-06-25 14 views
7

Ilekroć używam ArrayCollection z Doctrine ORM (2.3, PHP> 5.4) i kojarzę wartości obiektów z kluczem w kolekcji (np. Przy użyciu metody set), wartości są poprawnie zapisywane w bazie danych. Ale gdy chcę odzyskać kolekcję z encji, klucze nie zostaną odzyskane i zamiast tego używają indeksu numerycznego.Doctrine - Store ArrayCollection keys

Na przykład, jeśli mam następujących klas:

/** @Entity */ 
class MyEntity 
{ 
    /** @OneToMany(targetEntity="MyOtherEntity", mappedBy="mainEntity") */ 
    private $myArray; 

    public function __construct() 
    { 
     $this->myArray = new ArrayCollection(); 
    } 

    public function addOtherEntity($key, $value) 
    { 
     $this->myArray->set($key, $value); 
    } 

    ... 
} 

/** @Entity */ 
class MyOtherEntity 
{ 
    /** @ManyToOne(targetEntity="MyEntity", inversedBy="myArray") */ 
    private $mainEntity; 
    ... 
} 

Sposób set działa poprawnie, ale kiedy pobierania informacji klawiszy w $myArray zniknęły.

Jak sprawić, aby ORM prawidłowo pamiętał klucze? Z góry dziękuję.

Odpowiedz

5

ten jest rozwiązany w następujący sposób:

/** @Entity */ 
class MyEntity 
{ 
    /** @OneToMany(targetEntity="MyOtherEntity", mappedBy="mainEntity", indexBy="key") */ 
    private $myArray; 

    public function __construct() 
    { 
     $this->myArray = new ArrayCollection(); 
    } 

    public function addOtherEntity($key, $value) 
    { 
     $this->myArray->set($key, $value); 
    } 

    ... 
} 

/** @Entity */ 
class MyOtherEntity 
{ 
    /** @ManyToOne(targetEntity="MyEntity", inversedBy="myArray") */ 
    private $mainEntity; 

    /** @Column(name="MyOtherTable_Key", type="string", unique=true, length=50) 
    private $key; 
    ... 
} 

Należy również MyOtherTable_Key w schemacie db więc może przechowywać klucz prawidłowo.

Pamiętaj, aby zawsze ustawiać klucz obiektu na właściwość. Jednym ze sposobów, aby to zrobić, jest zadeklarowanie klucza w konstruktorze.

public function __construct($key) 
{ 
    $this->key = $key; 
} 
+0

Jest to rozwiązanie, aby uzyskać odpowiedź na klucz. –

+0

http://doctrine-orm.readthedocs.org/en/latest/tutorials/working-with-indexed-associations.html –

+0

Czekaj, jaka odpowiedź? Pytanie pierwsze? –