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, ]); } } }