2013-06-25 28 views
7

Bất cứ khi nào tôi sử dụng ArrayCollection với Doctrine ORM (2.3, PHP> 5.4), và liên kết giá trị đối tượng với khóa trong bộ sưu tập (chẳng hạn như khi sử dụng phương pháp set), các giá trị được lưu trữ chính xác trong cơ sở dữ liệu. Nhưng khi tôi muốn lấy bộ sưu tập từ thực thể, các phím không được lấy ra và thay vào đó chúng sử dụng một chỉ số dạng số.Doctrine - Store ArrayCollection keys

Ví dụ, nếu tôi có các lớp sau:

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

Phương pháp set hoạt động đúng, nhưng khi tôi lấy thông tin các phím trong $myArray đã mất hết.

Làm cách nào để làm cho ORM nhớ chính xác các phím? Cảm ơn bạn trước.

Trả lời

5

này được giải quyết theo cách sau:

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

Bạn cũng cần MyOtherTable_Key trong schema db của bạn để nó có thể lưu trữ các khóa đúng.

Hãy nhớ luôn đặt khóa đối tượng vào thuộc tính. Một cách để làm như vậy là khai báo khóa trong hàm tạo.

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

Đây có phải là giải pháp để nhận phản hồi được khóa. –

+0

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

+0

Đợi phản hồi nào? Truy vấn một? –