Коллекция массивов: как работает метод set? - PullRequest
0 голосов
/ 05 сентября 2018

Возможно, это глупый вопрос, но я не могу понять ...
Я пытаюсь создать базовую родительскую / дочернюю сущность для форума в доктрине. Я определил свои сущности и отношения 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;
}
...