Возможно, это глупый вопрос, но я не могу понять ...
Я пытаюсь создать базовую родительскую / дочернюю сущность для форума в доктрине. Я определил свои сущности и отношения ManyToOne. Я добавил метод с коллекцией массивов на стороне родителя. Я изменил метод addTopicarg (), чтобы массив всех комментариев по одной теме был в порядке иерархии родительского потомка, а не в хронологическом порядке. Если комментарий является ответом на другой комментарий, он должен быть сразу после его родителя в массиве. Тогда мне просто нужно сделать для просмотра всех комментариев.
В официальном документе доктрины установлен метод, который может помочь мне сделать это (ключ / индекс, объект). Но каждый раз, когда я добавляю объект с ключом / индексом 2, например, он добавляется в конце, хотя у меня есть 6 элементов.
Док говорит
набор
Устанавливает элемент в коллекции по указанному ключу / индексу.
$collection = new ArrayCollection();
$collection->set('name', 'jwage');
Я не знаю, является ли ключ / индекс просто способом идентификации добавленного объекта или это действительно номер места объекта, как в обычном массиве. Есть ли способ добавить объект по определенному индексу, например, между двумя другими объектами, в коллекцию массивов?
Я был бы рад, если бы кто-то мог помочь мне в этом. Я пытался понять это весь день ..
Вот родительская сущность:
namespace Shaker\JRQBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Shaker\JRQBundle\Entity\Contribution;
/**
* Topic
*
* @ORM\Table(name="topic")
* @ORM\Entity(repositoryClass="Shaker\JRQBundle\Repository\TopicRepository")
*/
class Topic extends Contribution
{
// Other attributes
/**
* @ORM\OneToMany(targetEntity="Shaker\JRQBundle\Entity\TopicArg", mappedBy="topic")
*/
private $topicargs;
// Other methods
/**
* Add topicarg
*
* @param \Shaker\JRQBundle\Entity\TopicArg $topicarg
*
* @return Topic
*/
public function addTopicarg(\Shaker\JRQBundle\Entity\TopicArg $topicarg, $topicargparent)
{
if ($topicargparent===null) {
// if no parent then add it at the end of the array
$this->topicargs[] = $topicarg;
} else {
// otherwise get indice parent and put it after
$key=indexOf($topicargparent);
$this->topicargs->set($key+1, $topicarg);
// indexOf(mixed $element)
//Gets the index/key of a given element. The comparison of two elements is strict, that means not only the value but also the type must match.
// ArrayCollection set(string|int $key, mixed $value)
}
return $this;
}
/**
* Remove topicarg
*
* @param \Shaker\JRQBundle\Entity\TopicArg $topicarg
*/
public function removeTopicarg(\Shaker\JRQBundle\Entity\TopicArg $topicarg)
{
$this->topicargs->removeElement($topicarg);
/**
* Get topicargs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTopicargs()
{
return $this->topicargs;
}
// Other methods
}
А вот и дочерняя сущность:
<?php
namespace Shaker\JRQBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Shaker\JRQBundle\Entity\Argumentation;
/**
* TopicArg
*
* @ORM\Table(name="topic_arg")
* @ORM\Entity(repositoryClass="Shaker\JRQBundle\Repository\TopicArgRepository")
*/
class TopicArg extends Argumentation
{
// other attributes
/**
* @ORM\ManyToOne(targetEntity="Shaker\JRQBundle\Entity\Topic", inversedBy="topicargs")
*/
protected $topic;
//other methods
/**
* Set topic
*
* @param \Shaker\JRQBundle\Entity\Topic $topic
*
* @return TopicArg
*/
public function setTopic(\Shaker\JRQBundle\Entity\Topic $topic = null)
{
$this->topic = $topic;
return $this;
}
/**
* Get topic
*
* @return \Shaker\JRQBundle\Entity\Topic
*/
public function getTopic()
{
return $this->topic;
}
// Other methods
}
И этот метод я переопределил:
/**
* Add topicarg
*
* @param \Shaker\JRQBundle\Entity\TopicArg $topicarg
*
* @return Topic
*/
public function addTopicarg(\Shaker\JRQBundle\Entity\TopicArg $topicarg, $topicargparent)
{
if ($topicargparent===null) {
// if no parent then add it at the end of the array
$this->topicargs[] = $topicarg;
} else {
// otherwise get indice parent and put it after
$key=indexOf($topicargparent);
$this->topicargs->set($key+1, $topicarg);
}
return $this;
}