SchulIT /
icc
| 1 | <?php |
||||||
| 2 | |||||||
| 3 | namespace App\DataFixtures; |
||||||
| 4 | |||||||
| 5 | use App\Entity\Grade; |
||||||
| 6 | use App\Entity\Student; |
||||||
| 7 | use App\Entity\StudyGroup; |
||||||
| 8 | use App\Entity\StudyGroupMembership; |
||||||
| 9 | use App\Entity\StudyGroupType; |
||||||
| 10 | use Doctrine\Bundle\FixturesBundle\Fixture; |
||||||
| 11 | use Doctrine\Common\DataFixtures\DependentFixtureInterface; |
||||||
| 12 | use Doctrine\Persistence\ObjectManager; |
||||||
| 13 | use Faker\Generator; |
||||||
| 14 | |||||||
| 15 | class StudyGroupFixtures extends Fixture implements DependentFixtureInterface { |
||||||
| 16 | |||||||
| 17 | public function __construct(private Generator $generator) |
||||||
| 18 | { |
||||||
| 19 | } |
||||||
| 20 | |||||||
| 21 | /** |
||||||
| 22 | * @inheritDoc |
||||||
| 23 | */ |
||||||
| 24 | public function load(ObjectManager $manager) { |
||||||
| 25 | $this->loadGradeStudyGroups($manager); |
||||||
| 26 | $this->loadInformatikAG($manager); |
||||||
| 27 | $this->loadEFStudyGroups($manager); |
||||||
| 28 | $this->loadQ1StudyGroups($manager); |
||||||
| 29 | |||||||
| 30 | $manager->flush(); |
||||||
| 31 | } |
||||||
| 32 | |||||||
| 33 | private function loadInformatikAG(ObjectManager $manager) { |
||||||
| 34 | $studyGroup = (new StudyGroup()) |
||||||
| 35 | ->setName('Informatik AG') |
||||||
| 36 | ->setExternalId('AG-IF') |
||||||
| 37 | ->setType(StudyGroupType::Course); |
||||||
| 38 | |||||||
| 39 | $grades = GradeFixtures::getSekIGradeNames(); |
||||||
| 40 | $agGrades = array_filter($grades, fn(string $name) => str_starts_with($name, '5')); |
||||||
| 41 | |||||||
| 42 | $students = [ ]; |
||||||
| 43 | |||||||
| 44 | foreach($agGrades as $id => $gradeName) { |
||||||
| 45 | $grade = $manager->getRepository(Grade::class) |
||||||
| 46 | ->findOneBy([ |
||||||
| 47 | 'externalId'=> $id |
||||||
| 48 | ]); |
||||||
| 49 | |||||||
| 50 | $studyGroup->addGrade($grade); |
||||||
| 51 | |||||||
| 52 | $gradeStudents = $manager->getRepository(Student::class) |
||||||
| 53 | ->findBy([ |
||||||
| 54 | 'grade' => $grade |
||||||
| 55 | ]); |
||||||
| 56 | |||||||
| 57 | for($i = 0; $i < 8; $i++) { |
||||||
| 58 | $students[] = $gradeStudents[$i]; |
||||||
| 59 | } |
||||||
| 60 | } |
||||||
| 61 | |||||||
| 62 | $manager->persist($studyGroup); |
||||||
| 63 | |||||||
| 64 | // Memberships |
||||||
| 65 | foreach($students as $student) { |
||||||
| 66 | $membership = (new StudyGroupMembership()) |
||||||
| 67 | ->setStudent($student) |
||||||
| 68 | ->setStudyGroup($studyGroup) |
||||||
| 69 | ->setType('PUT'); |
||||||
| 70 | |||||||
| 71 | $manager->persist($membership); |
||||||
| 72 | } |
||||||
| 73 | |||||||
| 74 | $manager->persist($studyGroup); |
||||||
| 75 | } |
||||||
| 76 | |||||||
| 77 | private function loadEFStudyGroups(ObjectManager $manager) { |
||||||
| 78 | $grade = $manager->getRepository(Grade::class) |
||||||
| 79 | ->findOneBy(['externalId' => 'EF']); |
||||||
| 80 | |||||||
| 81 | $students = $manager->getRepository(Student::class) |
||||||
| 82 | ->findBy([ |
||||||
| 83 | 'grade' => $grade |
||||||
| 84 | ]); |
||||||
| 85 | |||||||
| 86 | $subjects = [ 'M', 'D', 'E', 'IF', 'MU' ]; |
||||||
| 87 | $writtenSubjects = [ 'M', 'D', 'E']; |
||||||
| 88 | |||||||
| 89 | foreach($subjects as $subject) { |
||||||
| 90 | for ($courseNumber = 1; $courseNumber <= 3; $courseNumber++) { |
||||||
| 91 | $name = sprintf('%s-GK%d', $subject, $courseNumber); |
||||||
| 92 | $id = 'EF-' . $name; |
||||||
| 93 | |||||||
| 94 | $studyGroup = (new StudyGroup()) |
||||||
| 95 | ->setName($name) |
||||||
| 96 | ->setExternalId($id) |
||||||
| 97 | ->setType(StudyGroupType::Course); |
||||||
| 98 | |||||||
| 99 | $studyGroup->addGrade($grade); |
||||||
| 100 | |||||||
| 101 | $manager->persist($studyGroup); |
||||||
| 102 | |||||||
| 103 | for ($studentIndex = $courseNumber - 1; $studentIndex < count($students); $studentIndex += 3) { |
||||||
|
0 ignored issues
–
show
|
|||||||
| 104 | $type = in_array($subject, $writtenSubjects) ? |
||||||
| 105 | 'GKS' : |
||||||
| 106 | ($this->generator->boolean ? 'GKS' : 'GKM'); |
||||||
| 107 | |||||||
| 108 | $membership = (new StudyGroupMembership()) |
||||||
| 109 | ->setStudyGroup($studyGroup) |
||||||
| 110 | ->setStudent($students[$studentIndex]) |
||||||
| 111 | ->setType($type); |
||||||
| 112 | |||||||
| 113 | $studyGroup->getMemberships() |
||||||
| 114 | ->add($membership); |
||||||
| 115 | |||||||
| 116 | $manager->persist($membership); |
||||||
| 117 | } |
||||||
| 118 | } |
||||||
| 119 | } |
||||||
| 120 | } |
||||||
| 121 | |||||||
| 122 | private function loadQ1StudyGroups(ObjectManager $manager) { |
||||||
| 123 | $grade = $manager->getRepository(Grade::class) |
||||||
| 124 | ->findOneBy(['externalId' => 'Q1']); |
||||||
| 125 | |||||||
| 126 | $students = $manager->getRepository(Student::class) |
||||||
| 127 | ->findBy([ |
||||||
| 128 | 'grade' => $grade |
||||||
| 129 | ]); |
||||||
| 130 | |||||||
| 131 | $lkSubjects = [ 'M', 'D', 'E' ]; |
||||||
| 132 | $gkSubjects = [ 'IF', 'MU', 'L', 'F' ]; |
||||||
| 133 | $subjects = array_merge($lkSubjects, $gkSubjects); |
||||||
| 134 | |||||||
| 135 | $studyGroups = [ ]; |
||||||
| 136 | |||||||
| 137 | foreach($subjects as $subject) { |
||||||
| 138 | for($i = 1; $i <= 2; $i++) { // 2 Kurse pro Fach |
||||||
| 139 | $name = sprintf( |
||||||
| 140 | '%s-%s%d', |
||||||
| 141 | $subject, |
||||||
| 142 | in_array($subject, $lkSubjects) ? 'LK' : 'GK', |
||||||
| 143 | $i |
||||||
| 144 | ); |
||||||
| 145 | $id = 'Q1-' . $name; |
||||||
| 146 | |||||||
| 147 | $studyGroup = (new StudyGroup()) |
||||||
| 148 | ->setExternalId($id) |
||||||
| 149 | ->setName($name) |
||||||
| 150 | ->setType(StudyGroupType::Course); |
||||||
| 151 | $studyGroup->addGrade($grade); |
||||||
| 152 | |||||||
| 153 | $studyGroups[$id] = $studyGroup; |
||||||
| 154 | |||||||
| 155 | $manager->persist($studyGroup); |
||||||
| 156 | } |
||||||
| 157 | } |
||||||
| 158 | |||||||
| 159 | foreach($lkSubjects as $subject) { // Auch GKs erzeugen |
||||||
| 160 | for($i = 1; $i <= 2; $i++) { |
||||||
| 161 | $name = sprintf( |
||||||
| 162 | '%s-GK%d', |
||||||
| 163 | $subject, |
||||||
| 164 | $i |
||||||
| 165 | ); |
||||||
| 166 | $id = 'Q1-' . $name; |
||||||
| 167 | |||||||
| 168 | $studyGroup = (new StudyGroup()) |
||||||
| 169 | ->setExternalId($id) |
||||||
| 170 | ->setName($name) |
||||||
| 171 | ->setType(StudyGroupType::Course); |
||||||
| 172 | $studyGroup->addGrade($grade); |
||||||
| 173 | |||||||
| 174 | $studyGroups[$id] = $studyGroup; |
||||||
| 175 | |||||||
| 176 | $manager->persist($studyGroup); |
||||||
| 177 | } |
||||||
| 178 | } |
||||||
| 179 | |||||||
| 180 | foreach($students as $student) { |
||||||
| 181 | $appliedSubjects = [ ]; |
||||||
| 182 | $lks = $this->generator->randomElements($lkSubjects, 2); |
||||||
|
0 ignored issues
–
show
The call to
Faker\Generator::randomElements() has too few arguments starting with 'c'].
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. Loading history...
|
|||||||
| 183 | |||||||
| 184 | // LK1+LK2 |
||||||
| 185 | for($i = 0; $i < 2; $i++) { |
||||||
| 186 | $id = sprintf( |
||||||
| 187 | 'Q1-%s-LK%d', |
||||||
| 188 | $lks[$i], |
||||||
| 189 | $this->generator->numberBetween(1, 2) |
||||||
| 190 | ); |
||||||
| 191 | $membership = (new StudyGroupMembership()) |
||||||
| 192 | ->setStudyGroup($studyGroups[$id]) |
||||||
| 193 | ->setStudent($student) |
||||||
| 194 | ->setType(sprintf('LK%d', $i + 1)); |
||||||
| 195 | |||||||
| 196 | $manager->persist($membership); |
||||||
| 197 | } |
||||||
| 198 | |||||||
| 199 | $appliedSubjects = array_merge($appliedSubjects, $lks); |
||||||
| 200 | $availableSubjects = array_diff($subjects, $appliedSubjects); |
||||||
| 201 | $gks = $this->generator->randomElements($availableSubjects, 2); |
||||||
| 202 | |||||||
| 203 | for($i = 0; $i < 2; $i++) { |
||||||
| 204 | $id = sprintf( |
||||||
| 205 | 'Q1-%s-GK%d', |
||||||
| 206 | $gks[$i], |
||||||
| 207 | $this->generator->numberBetween(1, 2) |
||||||
| 208 | ); |
||||||
| 209 | |||||||
| 210 | $membership = (new StudyGroupMembership()) |
||||||
| 211 | ->setStudyGroup($studyGroups[$id]) |
||||||
| 212 | ->setStudent($student) |
||||||
| 213 | ->setType(sprintf('ABI%d', $i + 3)); |
||||||
| 214 | |||||||
| 215 | $manager->persist($membership); |
||||||
| 216 | } |
||||||
| 217 | |||||||
| 218 | $appliedSubjects = array_merge($appliedSubjects, $gks); |
||||||
| 219 | $availableSubjects = array_diff($subjects, $appliedSubjects); |
||||||
| 220 | $leftOvers = $this->generator->randomElements($availableSubjects, 2); |
||||||
| 221 | |||||||
| 222 | foreach($leftOvers as $subject) { |
||||||
| 223 | $id = sprintf( |
||||||
| 224 | 'Q1-%s-GK%d', |
||||||
| 225 | $subject, |
||||||
| 226 | $this->generator->numberBetween(1, 2) |
||||||
| 227 | ); |
||||||
| 228 | |||||||
| 229 | $membership = (new StudyGroupMembership()) |
||||||
| 230 | ->setStudyGroup($studyGroups[$id]) |
||||||
| 231 | ->setStudent($student) |
||||||
| 232 | ->setType( |
||||||
| 233 | $this->generator->boolean ? 'GKS' : 'GKM' |
||||||
| 234 | ); |
||||||
| 235 | |||||||
| 236 | $manager->persist($membership); |
||||||
| 237 | } |
||||||
| 238 | } |
||||||
| 239 | } |
||||||
| 240 | |||||||
| 241 | private function loadGradeStudyGroups(ObjectManager $manager) { |
||||||
| 242 | $grades = array_merge( |
||||||
| 243 | GradeFixtures::getSekIGradeNames(), |
||||||
| 244 | GradeFixtures::getSekIIGradeNames() |
||||||
| 245 | ); |
||||||
| 246 | |||||||
| 247 | foreach($grades as $id => $name) { |
||||||
| 248 | $studyGroup = (new StudyGroup()) |
||||||
| 249 | ->setName($name) |
||||||
| 250 | ->setType(StudyGroupType::Grade) |
||||||
| 251 | ->setExternalId($id); |
||||||
| 252 | |||||||
| 253 | // Grade |
||||||
| 254 | $grade = $manager->getRepository(Grade::class) |
||||||
| 255 | ->findOneBy([ |
||||||
| 256 | 'externalId' => $id |
||||||
| 257 | ]); |
||||||
| 258 | |||||||
| 259 | $studyGroup->addGrade($grade); |
||||||
| 260 | $manager->persist($studyGroup); |
||||||
| 261 | |||||||
| 262 | // Memberships |
||||||
| 263 | $students = $manager->getRepository(Student::class) |
||||||
| 264 | ->findBy([ |
||||||
| 265 | 'grade' => $grade |
||||||
| 266 | ]); |
||||||
| 267 | |||||||
| 268 | foreach($students as $student) { |
||||||
| 269 | $membership = (new StudyGroupMembership()) |
||||||
| 270 | ->setStudyGroup($studyGroup) |
||||||
| 271 | ->setStudent($student) |
||||||
| 272 | ->setType('PUK'); |
||||||
| 273 | |||||||
| 274 | $manager->persist($membership); |
||||||
| 275 | } |
||||||
| 276 | } |
||||||
| 277 | } |
||||||
| 278 | |||||||
| 279 | /** |
||||||
| 280 | * @inheritDoc |
||||||
| 281 | */ |
||||||
| 282 | public function getDependencies() { |
||||||
| 283 | return [ |
||||||
| 284 | GradeFixtures::class, |
||||||
| 285 | SubjectFixtures::class, |
||||||
| 286 | StudentFixtures::class |
||||||
| 287 | ]; |
||||||
| 288 | } |
||||||
| 289 | } |
If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration: