IgorPI
@IgorPI

Doctrine2-nestedset лучшая практика?

Модель:


<?php


namespace Api\Model;


use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Index;
use DoctrineExtensions\NestedSet\MultipleRootNode;


/**
 * Class User
 * @ORM\Entity
 * @ORM\Table(name="category",
 *     indexes={@Index(name="idx", columns={"root", "lft", "rgt"})})
 *
 * @see http://www.getinfo.ru/article610.html
 */
class Category implements MultipleRootNode
{

    /**
     * Category constructor.
     * @param string $name
     */
    public function __construct(string $name = '')
    {
        $this->setName($name);
    }

    /**
     * @ORM\Id
     * @GeneratedValue
     *
     * @ORM\Column(type="integer")
     * @var integer
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @var int
     * @ORM\Column(type="integer", options={"default" : 0})
     */
    private $root;

    /**
     * @var int
     * @ORM\Column(type="integer", options={"default" : 0})
     */
    private $lft;

    /**
     * @var int
     * @ORM\Column(type="integer", options={"default" : 0})
     */
    private $rgt;

    /**
     * gets a unique identifier for this node
     *
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * gets a string representation of the Node
     *
     * @return string
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * gets Node's left value
     *
     * @return int
     */
    public function getLeftValue()
    {
        return $this->lft;
    }

    /**
     * sets Node's left value
     *
     * @param int $lft
     */
    public function setLeftValue($lft)
    {
        $this->lft = $lft;
    }

    /**
     * gets Node's right value
     *
     * @return int
     */
    public function getRightValue()
    {
        return $this->lft;
    }

    /**
     * sets Node's right value
     *
     * @param int $rgt
     */
    public function setRightValue($rgt)
    {
        $this->rgt = $rgt;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * gets Node's root value
     *
     * @return mixed
     */
    public function getRootValue()
    {
        return $this->root;
    }

    /**
     * sets Node's root value
     *
     * @param mixed $root
     */
    public function setRootValue($root)
    {
        $this->root = $root;
    }
}




Создание нового узла
// @see https://github.com/blt04/doctrine2-nestedset
        $config = new Config($this->em, Category::class);
        $nsm = new Manager($config);

        if ($this->request->has('root')){

            $root = $nsm->createRoot(new Category($this->request->mixed('name')));

        } else {
            $rootNode = $nsm->fetchTree((int)$this->request->mixed('parent'), 1);
            $rootNode->addChild(new Category($this->request->mixed('name')));
        }


Получение узлов
// @see https://github.com/blt04/doctrine2-nestedset
        $config = new Config($this->em, Category::class);
        $nsm = new Manager($config);


        $data = new ResponseSchema();
        $data->setCount(1000);
        $data->setItems($nsm->fetchTreeAsArray((int)$this->request->mixed('root')));

        $json = $this->serializer->serialize($data, 'json', ['attributes' => [

            'count',
            'items' => [
                'id',
                'node',
            ]
        ]]);
        $this->response->jsonSend($json);


Узлы в ответе
{
    "count": 1000,
    "items": [
        {
            "node": {
                "id": 3958,
                "leftValue": 1,
                "rightValue": 1,
                "name": "Child 1",
                "rootValue": 3955
            },
            "id": 3958
        },
        {
            "node": {
                "id": 3955,
                "leftValue": 3,
                "rightValue": 3,
                "name": "Root 1",
                "rootValue": 3955
            },
            "id": 3955
        }
    ]
}


Хотелось бы сверится.
На сколько верна базовая реализация?

Не пойму, как создавать дочерние элементы в дочерних узлах?
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы