DictionarySeeder.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. /*
  3. * DictionarySeeder — заполняет справочники начальными данными.
  4. *
  5. * Создан: 2026-05-06
  6. * Запуск: php artisan db:seed (через DatabaseSeeder)
  7. * Идемпотентен: if(DictSection::count() > 0) return — повторный запуск ничего не делает
  8. *
  9. * Создаёт 8 системных разделов и их значения:
  10. * makes (иерархический) — 30+ марок, каждая с моделями
  11. * body_types — типы кузова
  12. * countries — страны происхождения
  13. * cities — города (преимущественно РФ Дальний Восток + крупные)
  14. * colors_ext / colors_int — цвета кузова и салона
  15. * engine_volumes — объёмы двигателя
  16. * options — опции комплектации
  17. */
  18. namespace Database\Seeders;
  19. use App\Models\DictSection;
  20. use App\Models\DictValue;
  21. use Illuminate\Database\Seeder;
  22. class DictionarySeeder extends Seeder
  23. {
  24. public function run(): void
  25. {
  26. if (DictSection::count() > 0) {
  27. return;
  28. }
  29. $sections = [
  30. ['makes', 'Марки и модели', true, true, 10],
  31. ['body_types', 'Типы кузова', true, false, 20],
  32. ['countries', 'Страны', true, false, 30],
  33. ['cities', 'Города', true, false, 40],
  34. ['colors_ext', 'Цвета кузова', true, false, 50],
  35. ['colors_int', 'Цвета салона', true, false, 60],
  36. ['engine_volumes', 'Объём двигателя', true, false, 70],
  37. ['options', 'Опции', true, false, 80],
  38. ];
  39. $ids = [];
  40. foreach ($sections as [$code, $label, $system, $hier, $ord]) {
  41. $s = DictSection::create([
  42. 'code' => $code,
  43. 'label' => $label,
  44. 'is_system' => $system,
  45. 'is_hierarchical' => $hier,
  46. 'sort_order' => $ord,
  47. ]);
  48. $ids[$code] = $s->id;
  49. }
  50. $this->seed('body_types', $ids, null, ['Седан','Хэтчбек','Универсал','Внедорожник','Кроссовер','Минивэн',
  51. 'Купе','Кабриолет','Пикап','Фургон','Микроавтобус','Лифтбек','Лимузин','Родстер']);
  52. $this->seed('countries', $ids, null, ['Япония','Южная Корея','Германия','США','Китай','Великобритания',
  53. 'Франция','Италия','Швеция','Россия','Чехия','Испания','Другое']);
  54. $this->seed('cities', $ids, null, ['Владивосток','Находка','Уссурийск','Артём','Хабаровск',
  55. 'Комсомольск-на-Амуре','Благовещенск','Якутск','Южно-Сахалинск','Магадан',
  56. 'Петропавловск-Камчатский','Чита','Улан-Удэ','Иркутск','Красноярск',
  57. 'Новосибирск','Омск','Екатеринбург','Тюмень','Москва','Санкт-Петербург',
  58. 'Казань','Краснодар','Ростов-на-Дону','Другой город']);
  59. $this->seed('colors_ext', $ids, null, ['Белый','Белый перламутр','Серебристый','Серый','Тёмно-серый',
  60. 'Чёрный','Красный','Тёмно-красный','Бордовый','Синий','Тёмно-синий','Голубой',
  61. 'Зелёный','Тёмно-зелёный','Бежевый','Коричневый','Золотой','Жёлтый','Оранжевый',
  62. 'Фиолетовый','Розовый','Другой']);
  63. $this->seed('colors_int', $ids, null, ['Чёрный','Серый','Бежевый','Коричневый','Белый','Красный',
  64. 'Синий','Комбинированный','Другой']);
  65. $this->seed('engine_volumes', $ids, null, ['0.6','0.8','1.0','1.2','1.3','1.4','1.5','1.6','1.8',
  66. '2.0','2.2','2.3','2.4','2.5','2.7','2.8','3.0','3.2','3.3','3.5','3.6','3.8',
  67. '4.0','4.2','4.4','4.5','5.0','5.4','5.5','6.0','6.2','6.5','6.7']);
  68. $this->seed('options', $ids, null, ['Кондиционер','Климат-контроль','Обогрев сидений',
  69. 'Вентиляция сидений','Обогрев руля','Обогрев зеркал','Обогрев лобового стекла',
  70. 'Кожаный салон','Электрорегулировка сидений','Мультируль','Круиз-контроль',
  71. 'Адаптивный круиз-контроль','Навигация','CarPlay','Android Auto','Bluetooth','USB',
  72. 'Камера заднего вида','Камера 360°','Парктроники передние','Парктроники задние',
  73. 'Система слепых зон','Система удержания полосы','Бесключевой доступ',
  74. 'Кнопка старт/стоп','Люк','Панорамная крыша','Тонировка','Ксеноновые фары',
  75. 'Светодиодные фары','Противотуманные фары','Литые диски','Зимняя резина в комплекте',
  76. 'Фаркоп','Пневмоподвеска','Дистанционный запуск','Сигнализация','Видеорегистратор']);
  77. // Марки и модели (иерархия)
  78. $makesData = [
  79. 'Toyota' => ['Alphard','Auris','Camry','Corolla','Crown','Fortuner','Harrier','Highlander','Hilux','Land Cruiser','Land Cruiser Prado','Mark X','Prius','RAV4','Sequoia','Sienna','Yaris','4Runner'],
  80. 'Nissan' => ['370Z','Altima','Armada','Elgrand','GT-R','Juke','Leaf','Murano','Navara','Note','Pathfinder','Patrol','Qashqai','Serena','Teana','Tiida','X-Trail'],
  81. 'Mitsubishi' => ['ASX','Delica','Eclipse Cross','Galant','Grandis','L200','Lancer','Outlander','Pajero','Pajero Sport'],
  82. 'Honda' => ['Accord','CR-V','Civic','Fit','Freed','HR-V','Insight','Odyssey','Pilot','Ridgeline','Stepwgn','Stream'],
  83. 'Subaru' => ['BRZ','Forester','Impreza','Legacy','Levorg','Outback','WRX','WRX STI','XV'],
  84. 'Mazda' => ['2','3','6','CX-3','CX-30','CX-5','CX-7','CX-9','MPV','MX-5','RX-7','RX-8'],
  85. 'Suzuki' => ['Escudo','Grand Vitara','Jimny','Liana','Swift','SX4','Vitara'],
  86. 'Lexus' => ['CT','ES','GS','GX','IS','LC','LM','LS','LX','NX','RC','RX','UX'],
  87. 'Infiniti' => ['EX','FX','G','M','Q50','Q60','Q70','QX50','QX56','QX60','QX80'],
  88. 'BMW' => ['1 Series','2 Series','3 Series','4 Series','5 Series','7 Series','i4','iX','M3','M5','X1','X3','X5','X6','X7','Z4'],
  89. 'Mercedes-Benz' => ['A-Class','C-Class','CLA','CLS','E-Class','G-Class','GLA','GLC','GLE','GLS','S-Class','V-Class','Vito'],
  90. 'Audi' => ['A3','A4','A5','A6','A7','A8','Q3','Q5','Q7','Q8','R8','RS6','TT'],
  91. 'Volkswagen' => ['Amarok','Golf','Jetta','Passat','Polo','Tiguan','Touareg','Transporter'],
  92. 'Porsche' => ['911','Cayenne','Macan','Panamera','Taycan'],
  93. 'Land Rover' => ['Defender','Discovery','Discovery Sport','Range Rover','Range Rover Evoque','Range Rover Sport'],
  94. 'Jeep' => ['Cherokee','Commander','Grand Cherokee','Wrangler'],
  95. 'Ford' => ['Bronco','Explorer','F-150','Focus','Kuga','Mustang','Ranger','Transit'],
  96. 'Chevrolet' => ['Blazer','Camaro','Captiva','Colorado','Equinox','Silverado','Suburban','Tahoe','Trailblazer'],
  97. 'Kia' => ['Carnival','Cerato','EV6','Mohave','Seltos','Sorento','Sportage','Stinger','Telluride'],
  98. 'Hyundai' => ['Creta','Elantra','Ioniq 5','Ioniq 6','Kona','Palisade','Santa Fe','Sonata','Starex','Tucson'],
  99. 'Volvo' => ['S60','S90','V60','V90','XC40','XC60','XC90'],
  100. 'Skoda' => ['Enyaq','Fabia','Karoq','Kodiaq','Octavia','Superb'],
  101. 'Renault' => ['Arkana','Duster','Kaptur','Koleos','Logan','Megane','Sandero'],
  102. 'LADA' => ['Granta','Largus','Niva','Niva Legend','Niva Travel','Vesta'],
  103. 'UAZ' => ['Hunter','Patriot','Pickup'],
  104. 'Chery' => ['Arrizo 5','Arrizo 8','Omoda C5','Tiggo 4 Pro','Tiggo 7 Pro','Tiggo 8 Pro'],
  105. 'Haval' => ['Dargo','F7','H6','H9','Jolion'],
  106. 'Geely' => ['Atlas','Coolray','Monjaro','Okavango'],
  107. 'BYD' => ['Atto 3','Dolphin','Han','Seal','Song Plus','Tang'],
  108. 'Tesla' => ['Cybertruck','Model 3','Model S','Model X','Model Y'],
  109. 'Isuzu' => ['D-Max','MU-X'],
  110. 'Другое' => ['Другое'],
  111. ];
  112. $ord = 10;
  113. foreach ($makesData as $make => $models) {
  114. $parent = DictValue::create([
  115. 'section_id' => $ids['makes'],
  116. 'parent_id' => null,
  117. 'value' => $make,
  118. 'sort_order' => $ord,
  119. ]);
  120. foreach ($models as $mi => $model) {
  121. DictValue::create([
  122. 'section_id' => $ids['makes'],
  123. 'parent_id' => $parent->id,
  124. 'value' => $model,
  125. 'sort_order' => ($mi + 1) * 10,
  126. ]);
  127. }
  128. $ord += 10;
  129. }
  130. }
  131. // Вспомогательный метод: записывает массив значений в раздел с автоинкрементом sort_order
  132. // Используется для плоских разделов (body_types, countries, cities и т.д.)
  133. private function seed(string $code, array $ids, ?int $parentId, array $values): void
  134. {
  135. foreach ($values as $i => $value) {
  136. DictValue::create([
  137. 'section_id' => $ids[$code],
  138. 'parent_id' => $parentId,
  139. 'value' => $value,
  140. 'sort_order' => ($i + 1) * 10,
  141. ]);
  142. }
  143. }
  144. }