zend-blog-3-backend

Форк
0
/
CategoryRepository.php 
158 строк · 4.2 Кб
1
<?php
2

3
namespace App\Repository;
4

5
use App\Entity\Category;
6
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
7
use Doctrine\ORM\Query;
8
use 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
 */
18
class CategoryRepository extends ServiceEntityRepository
19
{
20
    /**
21
     * @param ManagerRegistry $registry
22
     */
23
    public function __construct(ManagerRegistry $registry)
24
    {
25
        parent::__construct($registry, Category::class);
26
    }
27

28
    /**
29
     * @return Query
30
     */
31
    public function getListQuery(): Query
32
    {
33
        $qb = $this->createQueryBuilder('e');
34

35
        return $qb->orderBy('e.name', 'ASC')
36
            ->getQuery();
37
    }
38

39
    /**
40
     * @return array
41
     */
42
    public 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

48
        return array_map(
49
            function ($el) {
50
                if ($el['depth'] > 1) {
51
                    $el['name'] = str_repeat('_ ', $el['depth'] - 1) . $el['name'];
52
                }
53

54
                return $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
     */
67
    public 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
     */
104
    public 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

113
        if ($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();
125
        if ($key == 0 && $entity->getParent()) {
126
            $key = $entity->getParent()->getNestedSet()->getLeftKey();
127
        }
128

129
        return $key;
130
    }
131

132
    public function save(Category $entity)
133
    {
134
        $new = is_null($entity->getId());
135

136
        $this->getEntityManager()->persist($entity);
137
        $this->getEntityManager()->flush();
138

139
        if ($new) {
140
            $parent = $entity->getParent();
141
            if ($parent) {
142
                $nsParent = $parent->getNestedSet();
143

144
                if ($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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.