2012-07-01 2 views
1

Если я определил следующий класс,Doctrine2 Многие ко многим не возвращает массив

class Category { 

    /** 
    * 
    * @var integer $id 
    * @Column(name="id", type="integer",nullable=false) 
    * @Id 
    * @GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

    /** 
    * 
    * @ManyToMany(targetEntity="Tag") 
    * @JoinColumn(onDelete="SET NULL") 
    */ 
    protected $tags; 
} 

Если я не в состоянии получить все теги, связанные с этой категории по:

$categoryTags = $category->getTags(); 

Объект в $ categoryTags после указанного назначения имеет тип Doctrine \ ORM \ PersistentCollection, в то время как я ожидаю, что он будет массивом.

Я добавил значения ассоциации в таблицу category_tag вручную с помощью команд sql, но я вижу, что они действительны.

Мои теги класс выглядит следующим образом:

class Tag extends Tag{ 

    /** 
    * 
    * @var integer $id 
    * @Column(name="id", type="integer",nullable=false) 
    * @Id 
    * @GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 


    /** 
    * @Column(type="string",length=60,nullable=false) 
    * @var string 
    */ 
    protected $tag; 

} 
+0

Почему вы ожидаете, что коллекция будет массив? См. Http://doctrine-orm.readthedocs.org/en/2.0.x/reference/architecture.html#architecture-persistent-fields – Phil

+0

См. Также http://doctrine-orm.readthedocs.org/en/latest/reference /association-mapping.html?highlight=many-to-many#collections – Phil

+0

'protected $ tags;' shouuld быть общедоступным или создавать метод для его возвращения как public public trat() {return $ this-> tags; } ' – manix

ответ

5

Учение не возвращает простые массивы для связанных коллекций сущностей. Скорее, он возвращает реализации Doctrine\Common\Collections\Collection.

Вы можете использовать их так, как если бы они расширили границы Countable, IteratorAggregate и ArrayAccess.

Если у вас действительно нужен массив (и я не могу придумать причину, почему), вы можете использовать метод toArray().

Пожалуйста, прочитайте документацию, чтобы понять, почему доктрина не использовать простые массивы

+1

Вот причина: у вас есть тип намека на PHP, и вы не хотите связываться с DoctrineCollection внутри вашего кода. Любая мысль об этом? – danidacar

+0

@danip Итак, тип-подсказка для 'ArrayAccess' вместо этого или не используется Doctrine – Phil

+0

Я не думаю, что есть лучшая альтернатива, чем Doctrine, и ArrayAccess не подразумевает, что вы можете использовать счет на нем. Жаль, что PHP виноват в этом необходимом соединении с каркасом (тип массива недостаточно хорош, как кажется). – danidacar

Смежные вопросы