diff --git a/app/Models/Loaders/PlaylistLoader.php b/app/Models/Loaders/PlaylistLoader.php index 4c27012..c68acb7 100644 --- a/app/Models/Loaders/PlaylistLoader.php +++ b/app/Models/Loaders/PlaylistLoader.php @@ -9,12 +9,12 @@ class PlaylistLoader public function getPlaylist(): array { $data = Track::select( - "Track.Name as Track", - "Performer.Name as Performer" - )->join('Performer', function ($join) { - $join->on('Performer.Id', "=", "Track.Performer") - ->where('Performer.DeleteDate', NULL); - })->orderBy('Performer')->get(); + "tracks.name as Track", + "performers.name as Performer" + )->join('performers', function ($join) { + $join->on('performers.id', "=", "tracks.performer_id") + ->where('performers.deleted_at', NULL); + })->orderBy('performer_id')->get(); return $data ? $data->toArray() : []; } diff --git a/app/Models/ORM/Track.php b/app/Models/ORM/Track.php index b64eafc..561dce7 100644 --- a/app/Models/ORM/Track.php +++ b/app/Models/ORM/Track.php @@ -9,11 +9,11 @@ class Track extends Model { use SoftDeletes; - const DELETED_AT = 'DeleteDate'; - const UPDATED_AT = 'UpdatedDate'; - const CREATED_AT = 'DateOfCreation'; + const DELETED_AT = 'deleted_at'; + const UPDATED_AT = 'updated_at'; + const CREATED_AT = 'created_at'; protected $primaryKey = 'Id'; - protected $table = 'Track'; - protected $fillable = ['Name', 'Length']; + protected $table = 'tracks'; + protected $fillable = [ 'name', 'length' ]; } diff --git a/database/migrations/2026_06_17_084215_create_performers_table.php b/database/migrations/2026_06_17_084215_create_performers_table.php new file mode 100644 index 0000000..1f7aa16 --- /dev/null +++ b/database/migrations/2026_06_17_084215_create_performers_table.php @@ -0,0 +1,29 @@ +id(); // id (bigint unsigned, auto-increment) + $table->string('name'); // name (имя исполнителя / название группы) + $table->timestamps(); // created_at и updated_at + $table->softDeletes(); // deleted_at (для мягкого удаления) + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('performers'); + } +}; diff --git a/database/migrations/2026_06_17_084348_create_tracks_table.php b/database/migrations/2026_06_17_084348_create_tracks_table.php new file mode 100644 index 0000000..dc1ef73 --- /dev/null +++ b/database/migrations/2026_06_17_084348_create_tracks_table.php @@ -0,0 +1,36 @@ +id(); // id (bigint unsigned, auto-increment) + $table->string('name'); // name (varchar 255) + $table->unsignedInteger('length'); // length (длительность трека в секундах) + + // performer_id (внешний ключ, связываем с таблицей performers) + $table->foreignId('performer_id') + ->constrained('performers') + ->onDelete('cascade'); // если удалить исполнителя, удалятся и его треки + + $table->timestamps(); // created_at и updated_at + $table->softDeletes(); // deleted_at (для мягкого удаления) + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tracks'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index f8c25d2..f4f15dd 100755 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -25,7 +25,9 @@ class DatabaseSeeder extends Seeder $this->call([ UserSeeder::class, EventSeeder::class, - PlaceSeeder::class + PlaceSeeder::class, + PerformerSeeder::class, + TrackSeeder::class ]); } } diff --git a/database/seeders/PerformerSeeder.php b/database/seeders/PerformerSeeder.php new file mode 100644 index 0000000..6cfa318 --- /dev/null +++ b/database/seeders/PerformerSeeder.php @@ -0,0 +1,37 @@ + 'Deep Purple'], + ['name' => 'Rainbow'], + ['name' => 'DIO'], + ['name' => 'Black Sabbath'], + ]; + + // Добавляем к каждой записи метки времени, чтобы поля не были пустыми + $now = Carbon::now(); + foreach ($performers as &$performer) { + $performer['created_at'] = $now; + $performer['updated_at'] = $now; + } + + // Чистим таблицу перед заполнением (опционально, чтобы не дублировать) + // DB::table('performers')->truncate(); + + // Массовая вставка в базу данных + DB::table('performers')->insert($performers); + } +} diff --git a/database/seeders/TrackSeeder.php b/database/seeders/TrackSeeder.php new file mode 100644 index 0000000..d6dfd18 --- /dev/null +++ b/database/seeders/TrackSeeder.php @@ -0,0 +1,74 @@ +command->error("Таблица 'performers' отсутствует в базе данных!"); + } + + // Очищаем таблицу перед заполнением + DB::table('tracks')->truncate(); + + // 1. Получаем ID исполнителей из базы по их именам + $rainbowId = DB::table('performers')->where('name', 'Rainbow')->value('id'); + $blackSabbathId = DB::table('performers')->where('name', 'Black Sabbath')->value('id'); + $dioId = DB::table('performers')->where('name', 'DIO')->value('id'); + + // Если сидер запускается отдельно и исполнителей нет, остановим процесс + if (!$rainbowId || !$blackSabbathId || !$dioId) { + $this->command->error('Исполнители не найдены в базе данных. Сначала запустите PerformerSeeder!'); + return; + } + + // 2. Список треков со связями + $tracksData = [ + // Rainbow + ['name' => 'Gates Of Babylon', 'performer_id' => $rainbowId], + ['name' => 'Lady Of The Lake', 'performer_id' => $rainbowId], + ['name' => 'Tarot Woman', 'performer_id' => $rainbowId], + ['name' => 'Long Live Rock\'n\'Roll', 'performer_id' => $rainbowId], + ['name' => 'Man On The Silver Mountain', 'performer_id' => $rainbowId], + ['name' => 'Kill The King', 'performer_id' => $rainbowId], + ['name' => 'Can\'t Let You Go', 'performer_id' => $rainbowId], + ['name' => 'Rainbow\'s Eyes', 'performer_id' => $rainbowId], + ['name' => 'Sixteen Century Greensleeves', 'performer_id' => $rainbowId], + + // Black Sabbath + ['name' => 'Neon Knights', 'performer_id' => $blackSabbathId], + ['name' => 'Children Of The Sea', 'performer_id' => $blackSabbathId], + ['name' => 'Heaven And Hell', 'performer_id' => $blackSabbathId], + + // DIO + ['name' => 'Holy Diver', 'performer_id' => $dioId], + ['name' => 'Last In Line', 'performer_id' => $dioId], + ['name' => 'All The Fools Sailed Away', 'performer_id' => $dioId], + ['name' => 'One Night In The City', 'performer_id' => $dioId], + ['name' => 'Straight Through The Heart', 'performer_id' => $dioId], + ]; + + // 3. Подготовка данных (добавляем случайную длину и метки времени) + $now = Carbon::now(); + foreach ($tracksData as &$track) { + $track['length'] = rand(180, 420); // Генерируем длину трека от 3 до 7 минут (в секундах) + $track['created_at'] = $now; + $track['updated_at'] = $now; + } + + // 4. Массовая вставка в базу данных + DB::table('tracks')->insert($tracksData); + } +}