2014-12-14 2 views
5

Мой вопрос близок к this one, но точно не подходит для моего.Сортировка @OneToMany ArrayCollection учения

Я этот столбец в объекте:

/** 
* @var ArrayCollection[SubjectTag] 
* 
* @ORM\OneToMany(targetEntity="SubjectTag", mappedBy="subject") 
* @Assert\Count(max = 10, maxMessage = "You can't create more than 10 tags.") 
* @Assert\Valid() 
*/ 
protected $subjectTags; 

Я хочу, чтобы динамически заказать свои метки на позиции, определенной в SubjectTag.position.

ответ

5

Попробуйте использовать функциональные возможности ORM doctrine2 для Ordering To-Many Associations как это:

/** 
* @var ArrayCollection[SubjectTag] 
* 
* @ORM\OneToMany(targetEntity="SubjectTag", mappedBy="subject") 
* @ORM\OrderBy({"position" = "ASC"}) 
* @Assert\Count(max = 10, maxMessage = "You can't create more than 10 tags.") 
* @Assert\Valid() 
*/ 
protected $subjectTags; 

Надеется, что это поможет

+0

Whooooo так красиво! –

2

Я нашел решение, используя @HasLifeCycleCallbacks.

use Doctrine\ORM\Mapping as ORM; 

/** 
* ... 
* @ORM\HasLifecycleCallbacks 
*/ 
class Subject 
{ 

    /** 
    * @var ArrayCollection[SubjectTag] 
    * 
    * @ORM\OneToMany(targetEntity="SubjectTag", mappedBy="subject") 
    * @Assert\Count(max = 10, maxMessage = "You can't create more than 10 tags.") 
    * @Assert\Valid() 
    */ 
    protected $subjectTags; 


    /** 
    * @ORM\PostLoad 
    */ 
    public function onPostLoad() 
    { 
     $tags = $this->subjectTags->toArray(); 
     usort($tags, function($a, $b) 
     { 
      return $a->getPosition() == $b->getPosition() ? 0 : ($a->getPosition() > $b->getPosition() : -1 : 1); 
     }); 
     $this->subjectTags = new ArrayCollection($tags); 
    } 

} 
+0

большого трюка. Но как насчет 'каскадного'параметра? Я попробовал ваше решение и получил тип ошибки «обновление или удаление в таблице» ... «нарушает ограничение внешнего ключа ...». Я думаю, что из-за новой коллекции – ceadreak

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