2013-06-25 2 views
7

Всякий раз, когда я использую ArrayCollection с Doctrine ORM (2.3, PHP> 5.4) и связываю значения объекта с ключом в коллекции (например, при использовании метода set), значения сохраняются правильно в базе данных. Но когда я хочу извлечь коллекцию из сущности, ключи не получаются, и вместо этого они используют числовой индекс.Doctrine - Store ArrayCollection keys

Например, если у меня есть следующие классы:

/** @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; 
    ... 
} 

Метод set работает нормально, но когда я получить информацию ключи в $myArray ушли.

Как заставить ОРМ правильно запомнить ключи? Спасибо заранее.

ответ

5

Это решается следующим образом:

/** @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; 
    ... 
} 

Вы также должны MyOtherTable_Key в вашей БД схемы, поэтому он может хранить ключ правильно.

Не забудьте указать ключ объекта в свойстве. Один из способов сделать это - объявить ключ в конструкторе.

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

Является ли это решением для получения ответа на ввод ключей. –

+0

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

+0

Ждать ответа? Запрос один? –