diff --git a/clubs_and_players_dump.sql b/clubs_and_players_dump.sql deleted file mode 100644 index 85203fb..0000000 --- a/clubs_and_players_dump.sql +++ /dev/null @@ -1,98 +0,0 @@ --- MySQL dump 10.13 Distrib 9.7.0, for Linux (x86_64) --- --- Host: localhost Database: test_fhr --- ------------------------------------------------------ --- Server version 9.7.0 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; -SET @@SESSION.SQL_LOG_BIN= 0; - --- --- GTID state at the beginning of the backup --- - -SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '508e7ea7-63f5-11f1-9d13-5242ca7f4bf5:1-285'; - --- --- Table structure for table `clubs` --- - -DROP TABLE IF EXISTS `clubs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `clubs` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `name_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `city_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `city_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `clubs` --- - -LOCK TABLES `clubs` WRITE; -/*!40000 ALTER TABLE `clubs` DISABLE KEYS */; -INSERT INTO `clubs` VALUES (1,'Металлург','Metallurg','Магнитогорск','Magnitogorsk','2026-06-09 14:08:31','2026-06-09 14:08:31'),(2,'Северсталь','Severstal','Сочи','Sochi','2026-06-09 14:08:31','2026-06-09 14:08:31'),(3,'Сибирь','Sibir','Санкт-Петербург','St. Petersburg','2026-06-09 14:08:31','2026-06-09 14:08:31'),(4,'Спартак','Spartak','Тольятти','Tolyatti','2026-06-09 14:08:31','2026-06-09 14:08:31'),(5,'Сочи','Sochi','Астана','Astana','2026-06-09 14:08:31','2026-06-09 14:08:31'),(6,'Салават Юлаев','Salavat Yulaev','Уфа','Ufa','2026-06-09 14:08:31','2026-06-09 14:08:31'),(7,'Металлург','Metallurg','Новосибирск','Novosibirsk','2026-06-09 14:08:31','2026-06-09 14:08:31'),(8,'Салават Юлаев','Salavat Yulaev','Хабаровск','Khabarovsk','2026-06-09 14:08:31','2026-06-09 14:08:31'),(9,'Металлург','Metallurg','Тольятти','Tolyatti','2026-06-09 14:08:31','2026-06-09 14:08:31'),(10,'СКА','SKA','Владивосток','Vladivostok','2026-06-09 14:08:31','2026-06-09 14:08:31'),(11,'Динамо','Dynamo','Владивосток','Vladivostok','2026-06-09 14:08:31','2026-06-09 14:08:31'),(12,'Ак Барс','Ak Bars','Санкт-Петербург','St. Petersburg','2026-06-09 14:08:31','2026-06-09 14:08:31'); -/*!40000 ALTER TABLE `clubs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `players` --- - -DROP TABLE IF EXISTS `players`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `players` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `full_name_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `full_name_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `weight` int unsigned NOT NULL, - `height` int unsigned NOT NULL, - `squad_number` tinyint NOT NULL, - `club_id` bigint unsigned NOT NULL, - `created_at` timestamp NULL DEFAULT NULL, - `updated_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `players_club_id_squad_number_unique` (`club_id`,`squad_number`), - CONSTRAINT `players_club_id_foreign` FOREIGN KEY (`club_id`) REFERENCES `clubs` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `players` --- - -LOCK TABLES `players` WRITE; -/*!40000 ALTER TABLE `players` DISABLE KEYS */; -INSERT INTO `players` VALUES (1,'Данис Зарипов','Danis Zaripov',72,172,45,9,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(2,'Илья Брызгалов','Ilya Bryzgalov',73,168,89,3,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(3,'Александр Семин','Alexander Semin',102,163,43,3,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(4,'Василий Подколзин','Vasily Podkolzin',96,173,94,11,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(5,'Егор Чинахов','Yegor Chinakhov',85,187,13,2,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(6,'Александр Георгиев','Alexandar Georgiev',97,172,97,8,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(7,'Александр Еременко','Alexander Yeryomenko',70,189,35,12,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(8,'Павел Бучневич','Pavel Buchnevich',96,190,61,10,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(9,'Антон Худобин','Anton Khudobin',85,199,5,4,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(10,'Александр Еременко','Alexander Yeryomenko',82,173,91,12,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(11,'Даниил Мироманов','Daniil Miromanov',100,177,22,3,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(12,'Александр Степанов','Alexander Stepanov',89,208,83,2,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(13,'Евгений Малкин','Evgeni Malkin',86,179,12,10,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(14,'Николай Хабибулин','Nikolai Khabibulin',94,203,71,10,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(15,'Александр Могильный','Alexander Mogilny',101,166,91,5,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(16,'Михаил Сергачев','Mikhail Sergachev',86,183,37,1,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(17,'Илья Ковальчук','Ilya Kovalchuk',68,171,10,2,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(18,'Николай Кулемин','Nikolay Kulemin',78,205,58,2,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(19,'Максим Сушинский','Maxim Sushinsky',70,164,66,10,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(20,'Евгений Кузнецов','Evgeny Kuznetsov',79,196,94,12,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(21,'Иван Проворов','Ivan Provorov',101,209,93,1,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(22,'Даниил Тарасов','Daniil Tarasov',96,181,78,12,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(23,'Сергей Светлов','Sergei Svetlov',85,163,69,6,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(24,'Илья Никулин','Ilya Nikulin',67,172,51,9,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(25,'Павел Бучневич','Pavel Buchnevich',90,170,68,3,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(26,'Семен Варламов','Semyon Varlamov',70,173,78,5,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(27,'Александр Гусев','Alexander Gusev',82,177,93,12,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(28,'Андрей Свечников','Andrei Svechnikov',67,194,5,7,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(29,'Валерий Васильев','Valeri Vasiliev',81,175,48,9,'2026-06-09 14:08:35','2026-06-09 14:08:35'),(30,'Александр Овечкин','Alexander Ovechkin',91,198,2,4,'2026-06-09 14:08:35','2026-06-09 14:08:35'); -/*!40000 ALTER TABLE `players` ENABLE KEYS */; -UNLOCK TABLES; -SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2026-06-09 14:09:19 diff --git a/clubs_players_season_dump.sql b/clubs_players_season_dump.sql new file mode 100644 index 0000000..5ee166b --- /dev/null +++ b/clubs_players_season_dump.sql @@ -0,0 +1,154 @@ +-- MySQL dump 10.13 Distrib 9.7.0, for Linux (x86_64) +-- +-- Host: localhost Database: test_fhr +-- ------------------------------------------------------ +-- Server version 9.7.0 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; +SET @@SESSION.SQL_LOG_BIN= 0; + +-- +-- GTID state at the beginning of the backup +-- + +SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '508e7ea7-63f5-11f1-9d13-5242ca7f4bf5:1-727915'; + +-- +-- Table structure for table `clubs` +-- + +DROP TABLE IF EXISTS `clubs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `clubs` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `city_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `city_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `clubs` +-- + +LOCK TABLES `clubs` WRITE; +/*!40000 ALTER TABLE `clubs` DISABLE KEYS */; +INSERT INTO `clubs` VALUES (1,'Амур','Amur','Ярославль','Yaroslavl','2026-06-10 10:25:26','2026-06-10 10:25:26'),(2,'Динамо','Dynamo','Ярославль','Yaroslavl','2026-06-10 10:25:26','2026-06-10 10:25:26'),(3,'Металлург','Metallurg','Нижний Новгород','Nizhny Novgorod','2026-06-10 10:25:26','2026-06-10 10:25:26'),(4,'Северсталь','Severstal','Москва','Moscow','2026-06-10 10:25:26','2026-06-10 10:25:26'),(5,'Барыс','Barys','Ярославль','Yaroslavl','2026-06-10 10:25:26','2026-06-10 10:25:26'),(6,'Адмирал','Admiral','Омск','Omsk','2026-06-10 10:25:26','2026-06-10 10:25:26'),(7,'Динамо','Dynamo','Сочи','Sochi','2026-06-10 10:25:26','2026-06-10 10:25:26'),(8,'Амур','Amur','Сочи','Sochi','2026-06-10 10:25:26','2026-06-10 10:25:26'),(9,'Северсталь','Severstal','Новосибирск','Novosibirsk','2026-06-10 10:25:26','2026-06-10 10:25:26'),(10,'Нефтехимик','Neftekhimik','Пекин','Beijing','2026-06-10 10:25:26','2026-06-10 10:25:26'); +/*!40000 ALTER TABLE `clubs` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `players` +-- + +DROP TABLE IF EXISTS `players`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `players` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `full_name_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `full_name_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `weight` int unsigned NOT NULL, + `height` int unsigned NOT NULL, + `squad_number` tinyint NOT NULL, + `club_id` bigint unsigned NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `players_club_id_squad_number_unique` (`club_id`,`squad_number`), + CONSTRAINT `players_club_id_foreign` FOREIGN KEY (`club_id`) REFERENCES `clubs` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `players` +-- + +LOCK TABLES `players` WRITE; +/*!40000 ALTER TABLE `players` DISABLE KEYS */; +INSERT INTO `players` VALUES (1,'Александр Овечкин','Alexander Ovechkin',77,199,22,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(2,'Евгений Малкин','Evgeni Malkin',88,170,84,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(3,'Никита Кучеров','Nikita Kucherov',95,206,32,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(4,'Артемий Панарин','Artemi Panarin',93,168,15,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(5,'Андрей Василевский','Andrei Vasilevskiy',102,181,63,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(6,'Илья Ковальчук','Ilya Kovalchuk',101,183,62,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(7,'Павел Дацюк','Pavel Datsyuk',71,186,89,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(8,'Владимир Тарасенко','Vladimir Tarasenko',97,189,96,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(9,'Сергей Бобровский','Sergei Bobrovsky',78,168,27,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(10,'Кирилл Капризов','Kirill Kaprizov',105,210,66,1,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(11,'Игорь Шестеркин','Igor Shesterkin',99,187,30,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(12,'Илья Сорокин','Ilya Sorokin',78,202,22,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(13,'Александр Радулов','Alexander Radulov',83,190,76,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(14,'Евгений Кузнецов','Evgeny Kuznetsov',76,178,20,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(15,'Дмитрий Орлов','Dmitry Orlov',76,198,35,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(16,'Михаил Сергачев','Mikhail Sergachev',83,188,28,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(17,'Иван Проворов','Ivan Provorov',87,210,88,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(18,'Илья Самсонов','Ilya Samsonov',98,203,53,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(19,'Александр Романов','Alexander Romanov',90,189,13,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(20,'Андрей Свечников','Andrei Svechnikov',96,176,19,2,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(21,'Евгений Дадонов','Evgenii Dadonov',67,177,61,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(22,'Вадим Шипачев','Vadim Shipachyov',77,198,46,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(23,'Никита Гусев','Nikita Gusev',86,194,58,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(24,'Вячеслав Войнов','Vyacheslav Voynov',100,191,31,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(25,'Антон Худобин','Anton Khudobin',89,177,85,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(26,'Семен Варламов','Semyon Varlamov',102,210,59,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(27,'Валерий Ничушкин','Valeri Nichushkin',96,207,35,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(28,'Павел Бучневич','Pavel Buchnevich',74,188,72,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(29,'Владислав Гавриков','Vladislav Gavrikov',81,200,30,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(30,'Илья Михеев','Ilya Mikheyev',70,203,99,3,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(31,'Денис Гурьянов','Denis Gurianov',66,162,96,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(32,'Александр Барабанов','Alexander Barabanov',93,171,70,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(33,'Клим Костин','Klim Kostin',65,176,18,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(34,'Яков Тренин','Yakov Trenin',86,204,78,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(35,'Иван Барбашев','Ivan Barbashev',78,193,2,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(36,'Артем Зуб','Artem Zub',75,202,28,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(37,'Илья Любушкин','Ilya Lyubushkin',69,164,20,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(38,'Александр Георгиев','Alexandar Georgiev',73,170,27,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(39,'Петр Кочетков','Pyotr Kochetkov',80,192,40,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(40,'Даниил Тарасов','Daniil Tarasov',81,182,59,4,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(41,'Василий Подколзин','Vasily Podkolzin',102,196,23,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(42,'Григорий Денисенко','Grigori Denisenko',104,198,13,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(43,'Виталий Кравцов','Vitali Kravtsov',72,183,35,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(44,'Егор Чинахов','Yegor Chinakhov',78,197,69,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(45,'Марат Хуснутдинов','Marat Khusnutdinov',91,184,14,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(46,'Шакир Мухамадуллин','Shakir Mukhamadullin',92,191,74,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(47,'Александр Алексеев','Alexander Alexeyev',75,172,88,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(48,'Даниил Мироманов','Daniil Miromanov',100,163,32,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(49,'Дмитрий Воронков','Dmitri Voronkov',83,192,42,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(50,'Павел Дорофеев','Pavel Dorofeyev',78,210,75,5,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(51,'Николай Кулемин','Nikolay Kulemin',72,197,11,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(52,'Александр Семин','Alexander Semin',85,176,84,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(53,'Сергей Федоров','Sergei Fedorov',90,174,82,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(54,'Игорь Ларионов','Igor Larionov',97,165,7,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(55,'Вячеслав Фетисов','Viacheslav Fetisov',95,162,23,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(56,'Павел Буре','Pavel Bure',70,179,35,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(57,'Алексей Морозов','Aleksey Morozov',94,178,19,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(58,'Данис Зарипов','Danis Zaripov',99,199,87,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(59,'Максим Сушинский','Maxim Sushinsky',72,172,8,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(60,'Александр Степанов','Alexander Stepanov',75,160,57,6,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(61,'Илья Никулин','Ilya Nikulin',80,193,71,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(62,'Алексей Терещенко','Aleksey Tereshchenko',73,171,91,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(63,'Сергей Мозякин','Sergei Mozyakin',102,169,65,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(64,'Александр Еременко','Alexander Yeryomenko',79,163,51,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(65,'Василий Кошечкин','Vasily Koshechkin',79,171,58,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(66,'Илья Брызгалов','Ilya Bryzgalov',94,198,62,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(67,'Евгений Набоков','Evgeni Nabokov',69,191,85,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(68,'Николай Хабибулин','Nikolai Khabibulin',89,179,10,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(69,'Алексей Яшин','Alexei Yashin',84,205,33,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(70,'Валерий Каменский','Valeri Kamensky',71,193,25,7,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(71,'Алексей Жамнов','Alexei Zhamnov',94,197,46,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(72,'Александр Могильный','Alexander Mogilny',80,163,97,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(73,'Сергей Макаров','Sergei Makarov',79,167,85,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(74,'Владимир Крутов','Vladimir Krutov',103,166,47,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(75,'Вячеслав Быков','Vyacheslav Bykov',105,162,84,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(76,'Андрей Хомутов','Andrei Khomutov',75,193,24,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(77,'Александр Якушев','Alexander Yakushev',67,199,70,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(78,'Борис Михайлов','Boris Mikhailov',105,176,23,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(79,'Валерий Харламов','Valeri Kharlamov',81,196,40,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(80,'Владислав Третьяк','Vladislav Tretiak',67,163,25,8,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(81,'Виктор Тихонов','Viktor Tikhonov',66,178,24,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(82,'Всеволод Бобров','Vsevolod Bobrov',102,209,75,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(83,'Анатолий Фирсов','Anatoli Firsov',97,197,1,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(84,'Владимир Петров','Vladimir Petrov',81,173,82,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(85,'Сергей Капустин','Sergei Kapustin',73,209,42,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(86,'Виктор Жлуктов','Viktor Zhluktov',87,180,35,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(87,'Александр Мальцев','Alexander Maltsev',80,181,87,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(88,'Владимир Мышкин','Vladimir Myshkin',83,163,72,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(89,'Виктор Коноваленко','Viktor Konovalenko',83,160,14,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(90,'Евгений Паладьев','Yevgeni Paladiev',71,200,91,9,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(91,'Юрий Ляпкин','Yuri Lyapkin',86,189,79,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(92,'Владимир Шадрин','Vladimir Shadrin',66,205,82,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(93,'Александр Гусев','Alexander Gusev',103,160,61,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(94,'Валерий Васильев','Valeri Vasiliev',79,170,90,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(95,'Геннадий Цыганков','Gennady Tsygankov',78,209,53,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(96,'Александр Скворцов','Alexander Skvortsov',75,209,11,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(97,'Виктор Тюменев','Viktor Tyumenev',72,196,71,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(98,'Сергей Светлов','Sergei Svetlov',97,161,99,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(99,'Анатолий Семенов','Anatoly Semenov',76,193,10,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'),(100,'Андрей Ломакин','Andrei Lomakin',75,176,25,10,'2026-06-10 10:25:26','2026-06-10 10:25:26'); +/*!40000 ALTER TABLE `players` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `seasons` +-- + +DROP TABLE IF EXISTS `seasons`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seasons` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `title_ru` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `title_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `seasons` +-- + +LOCK TABLES `seasons` WRITE; +/*!40000 ALTER TABLE `seasons` DISABLE KEYS */; +INSERT INTO `seasons` VALUES (1,'2020 год','2020 year','2026-06-10 10:25:19','2026-06-10 10:25:19'),(2,'2021 год','2021 year','2026-06-10 10:25:19','2026-06-10 10:25:19'),(3,'2022 год','2022 year','2026-06-10 10:25:19','2026-06-10 10:25:19'),(4,'2023 год','2023 year','2026-06-10 10:25:19','2026-06-10 10:25:19'),(5,'2024 год','2024 year','2026-06-10 10:25:19','2026-06-10 10:25:19'),(6,'2025 год','2025 year','2026-06-10 10:25:19','2026-06-10 10:25:19'); +/*!40000 ALTER TABLE `seasons` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `player_season` +-- + +DROP TABLE IF EXISTS `player_season`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `player_season` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `season_id` bigint unsigned NOT NULL, + `player_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `player_season_season_id_player_id_unique` (`season_id`,`player_id`), + KEY `player_season_player_id_foreign` (`player_id`), + CONSTRAINT `player_season_player_id_foreign` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT `player_season_season_id_foreign` FOREIGN KEY (`season_id`) REFERENCES `seasons` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `player_season` +-- + +LOCK TABLES `player_season` WRITE; +/*!40000 ALTER TABLE `player_season` DISABLE KEYS */; +INSERT INTO `player_season` VALUES (1,1,35),(2,1,46),(3,1,53),(5,1,95),(4,1,99),(6,2,25),(7,2,50),(8,2,59),(9,2,67),(10,2,84),(11,3,23),(12,3,47),(13,3,71),(14,3,82),(15,3,93),(17,4,62),(16,4,67),(18,4,74),(20,4,91),(19,4,93),(21,5,35),(22,5,52),(23,5,67),(24,5,92),(25,5,94),(26,6,1),(27,6,20),(28,6,48),(29,6,55),(30,6,86); +/*!40000 ALTER TABLE `player_season` ENABLE KEYS */; +UNLOCK TABLES; +SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-06-10 10:28:34 diff --git a/main-repo/README.md b/main-repo/README.md index b933b30..61e3418 100644 --- a/main-repo/README.md +++ b/main-repo/README.md @@ -1,5 +1,5 @@ -## Тестовое задание ФХР +## Тестовое задание ФХР + upd - OS: Linux, AltLinux 11 - Editor: PhpStorm, MS Code @@ -67,23 +67,21 @@ php artisan app:test-fhr-sort ```bash fhr-php -# Клубы -php artisan db:seed --class=ClubSeeder -# Игроки, здесь может потребоваться пара запусков, -# я не полировал проверку уникальности номеров в клубе -# под капотом обычного сидирования -php artisan db:seed --class=PlayerSeeder +# Сидируем клубы, игроков, связь с сезонами +php artisan db:seed ``` Выгрузка данных по игрокам и клубам вместе со структурой ```bash +fhr-mysql + cd /var/lib/mysql-files -mysqldump -u root -psecret test_fhr clubs players > clubs_and_players_dump.sql +mysqldump -u root -psecret test_fhr clubs players seasons player_season > clubs_players_season_dump.sql ``` После такой выгрузки, дамп появится в папке MySQL-files -Тестовый дамп лежит в корне проекта **clubs_and_players_dump.sql** +Тестовый дамп лежит в корне проекта **clubs_players_season_dump.sql** **Время: 1 час 25 минут.** @@ -91,6 +89,8 @@ mysqldump -u root -psecret test_fhr clubs players > clubs_and_players_dump.sql Сидируем БД ```bash +fhr-php + # Долгий сид достаточно, минут 15-20 возможно php artisan db:seed --class=UserSeeder ``` diff --git a/main-repo/app/Models/Club.php b/main-repo/app/Models/Club.php index ff98ec1..0a99fe9 100644 --- a/main-repo/app/Models/Club.php +++ b/main-repo/app/Models/Club.php @@ -9,5 +9,8 @@ class Club extends Model { use HasFactory; - // + public function players() + { + return $this->hasMany(Player::class); + } } diff --git a/main-repo/app/Models/Player.php b/main-repo/app/Models/Player.php index 516949e..6d89696 100644 --- a/main-repo/app/Models/Player.php +++ b/main-repo/app/Models/Player.php @@ -2,12 +2,12 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Player extends Model { - use HasFactory; - - // -} + public function club() + { + return $this->belongsTo(Club::class); + } +} \ No newline at end of file diff --git a/main-repo/app/Models/Season.php b/main-repo/app/Models/Season.php new file mode 100644 index 0000000..37862ee --- /dev/null +++ b/main-repo/app/Models/Season.php @@ -0,0 +1,15 @@ +belongsToMany(Player::class); + } +} diff --git a/main-repo/database/migrations/2026_06_10_084011_seasons_table.php b/main-repo/database/migrations/2026_06_10_084011_seasons_table.php new file mode 100644 index 0000000..6397278 --- /dev/null +++ b/main-repo/database/migrations/2026_06_10_084011_seasons_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('title_ru'); + $table->string('title_en'); + $table->timestamps(); + }); + + // test seed + for ($i = 2020; $i < 2026; $i++) { + Season::create([ + 'title_ru' => $i . ' год', + 'title_en' => $i . ' year', + ]); + } + + Schema::create('player_season', function (Blueprint $table) { + $table->id(); + + $table->foreignIdFor(Season::class) + ->constrained() + ->onUpdate('cascade') + ->onDelete('restrict'); + + $table->foreignIdFor(Player::class) + ->constrained() + ->onUpdate('cascade') + ->onDelete('restrict'); + + $table->unique(['season_id', 'player_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('player_season'); + Schema::dropIfExists('seasons'); + } +}; diff --git a/main-repo/database/seeders/ClubSeeder.php b/main-repo/database/seeders/ClubSeeder.php index 48b627a..6af8718 100644 --- a/main-repo/database/seeders/ClubSeeder.php +++ b/main-repo/database/seeders/ClubSeeder.php @@ -14,7 +14,7 @@ class ClubSeeder extends Seeder public function run(): void { Club::factory() - ->count(12) + ->count(10) ->create(); } } diff --git a/main-repo/database/seeders/DatabaseSeeder.php b/main-repo/database/seeders/DatabaseSeeder.php index 34dd1c0..b4fc1e1 100644 --- a/main-repo/database/seeders/DatabaseSeeder.php +++ b/main-repo/database/seeders/DatabaseSeeder.php @@ -2,7 +2,6 @@ namespace Database\Seeders; -use App\Models\User; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -15,6 +14,14 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // + $this->command->info('Starting database seeding...'); + + $this->call([ + ClubSeeder::class, + PlayerSeeder::class, + SeasonPlayerSeeder::class, + ]); + + $this->command->info('Database seeding finished successfully.'); } } diff --git a/main-repo/database/seeders/PlayerSeeder.php b/main-repo/database/seeders/PlayerSeeder.php index e0bb6a4..07f770d 100644 --- a/main-repo/database/seeders/PlayerSeeder.php +++ b/main-repo/database/seeders/PlayerSeeder.php @@ -2,19 +2,60 @@ namespace Database\Seeders; +use App\Models\Club; use App\Models\Player; -use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Database\Seeders\Traits\HasPlayerNames; class PlayerSeeder extends Seeder { + use HasPlayerNames; + /** * Run the database seeds. */ public function run(): void { - Player::factory() - ->count(30) - ->create(); + $this->command->info('Seeding players for each club with unique squad numbers and names...'); + + $clubs = Club::all(); + $playerNames = $this->getPlayerNames(); + $totalNames = count($playerNames); + $nameIndex = 0; + + if ($clubs->isEmpty()) { + $this->command->warn('No clubs found. Skipping player seeding.'); + return; + } + + $this->command->getOutput()->progressStart($clubs->count()); + + foreach ($clubs as $club) { + $availableNumbers = range(1, 99); + shuffle($availableNumbers); + + for ($i = 0; $i < 10; $i++) { + $squadNumber = array_pop($availableNumbers); + if (is_null($squadNumber)) { + break; + } + + $name = $playerNames[$nameIndex % $totalNames]; + $nameIndex++; + + Player::create([ + 'club_id' => $club->id, + 'squad_number' => $squadNumber, + 'full_name_ru' => $name['ru'], + 'full_name_en' => $name['en'], + 'weight' => rand(65, 105), + 'height' => rand(160, 210), + ]); + } + $this->command->getOutput()->progressAdvance(); + } + + $this->command->getOutput()->progressFinish(); + $this->command->info("\nFinished seeding players."); } } diff --git a/main-repo/database/seeders/SeasonPlayerSeeder.php b/main-repo/database/seeders/SeasonPlayerSeeder.php new file mode 100644 index 0000000..981f7b3 --- /dev/null +++ b/main-repo/database/seeders/SeasonPlayerSeeder.php @@ -0,0 +1,40 @@ +command->info('Seeding season-player relationships...'); + + $seasons = Season::all(); + $allPlayerIds = Player::pluck('id'); + + if ($allPlayerIds->isEmpty()) { + $this->command->warn('No players found. Skipping season-player seeding.'); + return; + } + + $playersToAttachCount = min(5, $allPlayerIds->count()); + + foreach ($seasons as $season) { + $randomPlayerIds = $allPlayerIds->random($playersToAttachCount); + + // syncWithoutDetaching гарантирует уникальность связи. + // Если такая пара (season_id, player_id) уже есть, она не будет добавлена. + $season->players()->syncWithoutDetaching($randomPlayerIds); + } + + $this->command->info('Finished seeding season-player relationships.'); + } +} diff --git a/main-repo/database/factories/PlayerFactory.php b/main-repo/database/seeders/Traits/HasPlayerNames.php similarity index 86% rename from main-repo/database/factories/PlayerFactory.php rename to main-repo/database/seeders/Traits/HasPlayerNames.php index d75abda..bb40804 100644 --- a/main-repo/database/factories/PlayerFactory.php +++ b/main-repo/database/seeders/Traits/HasPlayerNames.php @@ -1,25 +1,12 @@ - */ -class PlayerFactory extends Factory +trait HasPlayerNames { - /** - * Define the model's default state. - * - * @return array - */ - public function definition(): array + protected function getPlayerNames(): array { - $names = [ + return [ ['ru' => 'Александр Овечкин', 'en' => 'Alexander Ovechkin'], ['ru' => 'Евгений Малкин', 'en' => 'Evgeni Malkin'], ['ru' => 'Никита Кучеров', 'en' => 'Nikita Kucherov'], @@ -121,31 +108,5 @@ class PlayerFactory extends Factory ['ru' => 'Анатолий Семенов', 'en' => 'Anatoly Semenov'], ['ru' => 'Андрей Ломакин', 'en' => 'Andrei Lomakin'], ]; - - $name = $names[array_rand($names)]; - $club = Club::inRandomOrder()->first(); - - if (!$club) { - throw new Exception('No clubs found in the database. Please seed the clubs table first.'); - } - - $usedNumbers = Player::where('club_id', $club->id)->pluck('squad_number')->toArray(); - - $availableNumbers = array_diff(range(1, 99), $usedNumbers); - - if (empty($availableNumbers)) { - throw new Exception("No available squad numbers for club ID: {$club->id}."); - } - - $squadNumber = $availableNumbers[array_rand($availableNumbers)]; - - return [ - 'full_name_ru' => $name['ru'], - 'full_name_en' => $name['en'], - 'weight' => rand(65, 105), - 'height' => rand(160, 210), - 'squad_number' => $squadNumber, - 'club_id' => $club->id, - ]; } }