| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /*
- * DictionarySeeder — заполняет справочники начальными данными.
- *
- * Создан: 2026-05-06
- * Запуск: php artisan db:seed (через DatabaseSeeder)
- * Идемпотентен: if(DictSection::count() > 0) return — повторный запуск ничего не делает
- *
- * Создаёт 8 системных разделов и их значения:
- * makes (иерархический) — 30+ марок, каждая с моделями
- * body_types — типы кузова
- * countries — страны происхождения
- * cities — города (преимущественно РФ Дальний Восток + крупные)
- * colors_ext / colors_int — цвета кузова и салона
- * engine_volumes — объёмы двигателя
- * options — опции комплектации
- */
- namespace Database\Seeders;
- use App\Models\DictSection;
- use App\Models\DictValue;
- use Illuminate\Database\Seeder;
- class DictionarySeeder extends Seeder
- {
- public function run(): void
- {
- if (DictSection::count() > 0) {
- return;
- }
- $sections = [
- ['makes', 'Марки и модели', true, true, 10],
- ['body_types', 'Типы кузова', true, false, 20],
- ['countries', 'Страны', true, false, 30],
- ['cities', 'Города', true, false, 40],
- ['colors_ext', 'Цвета кузова', true, false, 50],
- ['colors_int', 'Цвета салона', true, false, 60],
- ['engine_volumes', 'Объём двигателя', true, false, 70],
- ['options', 'Опции', true, false, 80],
- ];
- $ids = [];
- foreach ($sections as [$code, $label, $system, $hier, $ord]) {
- $s = DictSection::create([
- 'code' => $code,
- 'label' => $label,
- 'is_system' => $system,
- 'is_hierarchical' => $hier,
- 'sort_order' => $ord,
- ]);
- $ids[$code] = $s->id;
- }
- $this->seed('body_types', $ids, null, ['Седан','Хэтчбек','Универсал','Внедорожник','Кроссовер','Минивэн',
- 'Купе','Кабриолет','Пикап','Фургон','Микроавтобус','Лифтбек','Лимузин','Родстер']);
- $this->seed('countries', $ids, null, ['Япония','Южная Корея','Германия','США','Китай','Великобритания',
- 'Франция','Италия','Швеция','Россия','Чехия','Испания','Другое']);
- $this->seed('cities', $ids, null, ['Владивосток','Находка','Уссурийск','Артём','Хабаровск',
- 'Комсомольск-на-Амуре','Благовещенск','Якутск','Южно-Сахалинск','Магадан',
- 'Петропавловск-Камчатский','Чита','Улан-Удэ','Иркутск','Красноярск',
- 'Новосибирск','Омск','Екатеринбург','Тюмень','Москва','Санкт-Петербург',
- 'Казань','Краснодар','Ростов-на-Дону','Другой город']);
- $this->seed('colors_ext', $ids, null, ['Белый','Белый перламутр','Серебристый','Серый','Тёмно-серый',
- 'Чёрный','Красный','Тёмно-красный','Бордовый','Синий','Тёмно-синий','Голубой',
- 'Зелёный','Тёмно-зелёный','Бежевый','Коричневый','Золотой','Жёлтый','Оранжевый',
- 'Фиолетовый','Розовый','Другой']);
- $this->seed('colors_int', $ids, null, ['Чёрный','Серый','Бежевый','Коричневый','Белый','Красный',
- 'Синий','Комбинированный','Другой']);
- $this->seed('engine_volumes', $ids, null, ['0.6','0.8','1.0','1.2','1.3','1.4','1.5','1.6','1.8',
- '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',
- '4.0','4.2','4.4','4.5','5.0','5.4','5.5','6.0','6.2','6.5','6.7']);
- $this->seed('options', $ids, null, ['Кондиционер','Климат-контроль','Обогрев сидений',
- 'Вентиляция сидений','Обогрев руля','Обогрев зеркал','Обогрев лобового стекла',
- 'Кожаный салон','Электрорегулировка сидений','Мультируль','Круиз-контроль',
- 'Адаптивный круиз-контроль','Навигация','CarPlay','Android Auto','Bluetooth','USB',
- 'Камера заднего вида','Камера 360°','Парктроники передние','Парктроники задние',
- 'Система слепых зон','Система удержания полосы','Бесключевой доступ',
- 'Кнопка старт/стоп','Люк','Панорамная крыша','Тонировка','Ксеноновые фары',
- 'Светодиодные фары','Противотуманные фары','Литые диски','Зимняя резина в комплекте',
- 'Фаркоп','Пневмоподвеска','Дистанционный запуск','Сигнализация','Видеорегистратор']);
- // Марки и модели (иерархия)
- $makesData = [
- 'Toyota' => ['Alphard','Auris','Camry','Corolla','Crown','Fortuner','Harrier','Highlander','Hilux','Land Cruiser','Land Cruiser Prado','Mark X','Prius','RAV4','Sequoia','Sienna','Yaris','4Runner'],
- 'Nissan' => ['370Z','Altima','Armada','Elgrand','GT-R','Juke','Leaf','Murano','Navara','Note','Pathfinder','Patrol','Qashqai','Serena','Teana','Tiida','X-Trail'],
- 'Mitsubishi' => ['ASX','Delica','Eclipse Cross','Galant','Grandis','L200','Lancer','Outlander','Pajero','Pajero Sport'],
- 'Honda' => ['Accord','CR-V','Civic','Fit','Freed','HR-V','Insight','Odyssey','Pilot','Ridgeline','Stepwgn','Stream'],
- 'Subaru' => ['BRZ','Forester','Impreza','Legacy','Levorg','Outback','WRX','WRX STI','XV'],
- 'Mazda' => ['2','3','6','CX-3','CX-30','CX-5','CX-7','CX-9','MPV','MX-5','RX-7','RX-8'],
- 'Suzuki' => ['Escudo','Grand Vitara','Jimny','Liana','Swift','SX4','Vitara'],
- 'Lexus' => ['CT','ES','GS','GX','IS','LC','LM','LS','LX','NX','RC','RX','UX'],
- 'Infiniti' => ['EX','FX','G','M','Q50','Q60','Q70','QX50','QX56','QX60','QX80'],
- 'BMW' => ['1 Series','2 Series','3 Series','4 Series','5 Series','7 Series','i4','iX','M3','M5','X1','X3','X5','X6','X7','Z4'],
- 'Mercedes-Benz' => ['A-Class','C-Class','CLA','CLS','E-Class','G-Class','GLA','GLC','GLE','GLS','S-Class','V-Class','Vito'],
- 'Audi' => ['A3','A4','A5','A6','A7','A8','Q3','Q5','Q7','Q8','R8','RS6','TT'],
- 'Volkswagen' => ['Amarok','Golf','Jetta','Passat','Polo','Tiguan','Touareg','Transporter'],
- 'Porsche' => ['911','Cayenne','Macan','Panamera','Taycan'],
- 'Land Rover' => ['Defender','Discovery','Discovery Sport','Range Rover','Range Rover Evoque','Range Rover Sport'],
- 'Jeep' => ['Cherokee','Commander','Grand Cherokee','Wrangler'],
- 'Ford' => ['Bronco','Explorer','F-150','Focus','Kuga','Mustang','Ranger','Transit'],
- 'Chevrolet' => ['Blazer','Camaro','Captiva','Colorado','Equinox','Silverado','Suburban','Tahoe','Trailblazer'],
- 'Kia' => ['Carnival','Cerato','EV6','Mohave','Seltos','Sorento','Sportage','Stinger','Telluride'],
- 'Hyundai' => ['Creta','Elantra','Ioniq 5','Ioniq 6','Kona','Palisade','Santa Fe','Sonata','Starex','Tucson'],
- 'Volvo' => ['S60','S90','V60','V90','XC40','XC60','XC90'],
- 'Skoda' => ['Enyaq','Fabia','Karoq','Kodiaq','Octavia','Superb'],
- 'Renault' => ['Arkana','Duster','Kaptur','Koleos','Logan','Megane','Sandero'],
- 'LADA' => ['Granta','Largus','Niva','Niva Legend','Niva Travel','Vesta'],
- 'UAZ' => ['Hunter','Patriot','Pickup'],
- 'Chery' => ['Arrizo 5','Arrizo 8','Omoda C5','Tiggo 4 Pro','Tiggo 7 Pro','Tiggo 8 Pro'],
- 'Haval' => ['Dargo','F7','H6','H9','Jolion'],
- 'Geely' => ['Atlas','Coolray','Monjaro','Okavango'],
- 'BYD' => ['Atto 3','Dolphin','Han','Seal','Song Plus','Tang'],
- 'Tesla' => ['Cybertruck','Model 3','Model S','Model X','Model Y'],
- 'Isuzu' => ['D-Max','MU-X'],
- 'Другое' => ['Другое'],
- ];
- $ord = 10;
- foreach ($makesData as $make => $models) {
- $parent = DictValue::create([
- 'section_id' => $ids['makes'],
- 'parent_id' => null,
- 'value' => $make,
- 'sort_order' => $ord,
- ]);
- foreach ($models as $mi => $model) {
- DictValue::create([
- 'section_id' => $ids['makes'],
- 'parent_id' => $parent->id,
- 'value' => $model,
- 'sort_order' => ($mi + 1) * 10,
- ]);
- }
- $ord += 10;
- }
- }
- // Вспомогательный метод: записывает массив значений в раздел с автоинкрементом sort_order
- // Используется для плоских разделов (body_types, countries, cities и т.д.)
- private function seed(string $code, array $ids, ?int $parentId, array $values): void
- {
- foreach ($values as $i => $value) {
- DictValue::create([
- 'section_id' => $ids[$code],
- 'parent_id' => $parentId,
- 'value' => $value,
- 'sort_order' => ($i + 1) * 10,
- ]);
- }
- }
- }
|