zend-blog-3-backend
158 строк · 4.2 Кб
1<?php
2
3namespace App\Repository;
4
5use App\Entity\Category;
6use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
7use Doctrine\ORM\Query;
8use Doctrine\Persistence\ManagerRegistry;
9
10/**
11* CategoryRepository
12*
13* This class was generated by the Doctrine ORM. Add your own custom
14* repository methods below.
15*
16* @method Category[] findAll()
17*/
18class CategoryRepository extends ServiceEntityRepository
19{
20/**
21* @param ManagerRegistry $registry
22*/
23public function __construct(ManagerRegistry $registry)
24{
25parent::__construct($registry, Category::class);
26}
27
28/**
29* @return Query
30*/
31public function getListQuery(): Query
32{
33$qb = $this->createQueryBuilder('e');
34
35return $qb->orderBy('e.name', 'ASC')
36->getQuery();
37}
38
39/**
40* @return array
41*/
42public function getNamesArray(): array
43{
44$qb = $this->createQueryBuilder('c')
45->select('c.id', 'c.name', 'c.nestedSet.depth AS depth')
46->orderBy('c.nestedSet.leftKey', 'ASC');
47
48return array_map(
49function ($el) {
50if ($el['depth'] > 1) {
51$el['name'] = str_repeat('_ ', $el['depth'] - 1) . $el['name'];
52}
53
54return $el;
55},
56$qb->getQuery()->getArrayResult()
57);
58}
59
60/**
61* @param Category $entity
62* @param int $index
63* @param int $depth
64*
65* @return void
66*/
67public function addToTree(Category $entity, int $index, int $depth): void
68{
69$qb0 = $this->createQueryBuilder('c');
70$qb0->update()
71->set('c.nestedSet.leftKey', 'c.nestedSet.leftKey + 2')
72->where($qb0->expr()->gte('c.nestedSet.leftKey', ':idx'))
73->andWhere($qb0->expr()->isNotNull('c.nestedSet.leftKey'))
74->setParameter('idx', $index)
75->getQuery()
76->execute()
77;
78
79$qb1 = $this->createQueryBuilder('c');
80$qb1->update()
81->set('c.nestedSet.rightKey', 'c.nestedSet.rightKey + 2')
82->where($qb1->expr()->gte('c.nestedSet.rightKey', ':idx'))
83->andWhere($qb1->expr()->isNotNull('c.nestedSet.leftKey'))
84->setParameter('idx', $index)
85->getQuery()
86->execute()
87;
88
89$ns = $entity->getNestedSet();
90$ns
91->setLeftKey($index)
92->setRightKey($index + 1)
93->setDepth($depth)
94;
95
96$this->getEntityManager()->flush();
97}
98
99/**
100* @param Category $entity
101*
102* @return int
103*/
104public function findNeighbourKey(Category $entity): int
105{
106$qb = $this->createQueryBuilder('c');
107$qb
108->select('COALESCE(MAX(c.nestedSet.rightKey), 0)')
109->where($qb->expr()->lt('c.name', ':name'))
110->setParameter('name', $entity->getName())
111;
112
113if ($entity->getParent()) {
114$qb
115->andWhere($qb->expr()->eq('c.parent', ':parent'))
116->setParameter('parent', $entity->getParent()->getId())
117;
118} else {
119$qb
120->andWhere($qb->expr()->isNull('c.parent'))
121;
122}
123
124$key = (int)$qb->getQuery()->getSingleScalarResult();
125if ($key == 0 && $entity->getParent()) {
126$key = $entity->getParent()->getNestedSet()->getLeftKey();
127}
128
129return $key;
130}
131
132public function save(Category $entity)
133{
134$new = is_null($entity->getId());
135
136$this->getEntityManager()->persist($entity);
137$this->getEntityManager()->flush();
138
139if ($new) {
140$parent = $entity->getParent();
141if ($parent) {
142$nsParent = $parent->getNestedSet();
143
144if ($nsParent->getRightKey() - $nsParent->getLeftKey() == 1) {
145$index = $nsParent->getRightKey();
146} else {
147$index = 1 + $this->findNeighbourKey($entity);
148}
149$depth = $nsParent->getDepth() + 1;
150} else {
151$index = 1 + $this->findNeighbourKey($entity);
152$depth = 1;
153}
154
155$this->addToTree($entity, $index, $depth);
156}
157}
158}
159