139 lines
5.3 KiB
PHP
139 lines
5.3 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\Article as NewArticle;
|
|
use App\Models\Brand;
|
|
use App\Models\Legacy\Presseecho\Article as LegacyArticle;
|
|
use App\Models\Legacy\Presseecho\User as LegacyUser;
|
|
// Import der Models für die NEUE Struktur
|
|
use App\Models\User as NewUser;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
// Import der Models für die ALTE Struktur
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Str;
|
|
|
|
class MigratePresseData extends Command
|
|
{
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'migrate:presseecho';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Migrates all data from the old presseecho.de database to the new central database';
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*/
|
|
public function handle()
|
|
{
|
|
$this->info('Starting migration for presseecho.de...');
|
|
|
|
// Holen der Brand-ID für Presseecho aus der neuen DB
|
|
$brand = Brand::where('domain', 'presseecho.de')->first();
|
|
if (! $brand) {
|
|
$this->error('Brand "presseecho.de" not found in the new database. Please seed brands first.');
|
|
|
|
return 1;
|
|
}
|
|
|
|
// Deaktivieren von Foreign Key Checks für reibungsloses Einfügen
|
|
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;');
|
|
|
|
// Starten der einzelnen Migrationsschritte
|
|
$this->migrateUsers();
|
|
$this->migrateArticles($brand->id);
|
|
// $this->migrateCategories($brand->id); // Weitere Schritte hier hinzufügen
|
|
|
|
// Reaktivieren der Foreign Key Checks
|
|
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;');
|
|
|
|
$this->info('Migration for presseecho.de completed successfully!');
|
|
|
|
return 0;
|
|
}
|
|
|
|
private function migrateUsers()
|
|
{
|
|
$this->line('Migrating users...');
|
|
$progressBar = $this->output->createProgressBar(LegacyUser::count());
|
|
$progressBar->start();
|
|
|
|
// Chunking verwenden, um den Speicher bei vielen Nutzern zu schonen
|
|
LegacyUser::chunk(200, function ($legacyUsers) use ($progressBar) {
|
|
foreach ($legacyUsers as $legacyUser) {
|
|
// Prüfen, ob der Nutzer (anhand der E-Mail) bereits in der neuen DB existiert
|
|
$existingUser = NewUser::where('email', $legacyUser->email)->first();
|
|
|
|
if (! $existingUser) {
|
|
// Nutzer existiert noch nicht -> neu anlegen
|
|
NewUser::create([
|
|
'name' => $legacyUser->name,
|
|
'email' => $legacyUser->email,
|
|
'password' => $legacyUser->password, // Annahme: Passwörter sind bereits gehasht. Wenn nicht: Hash::make(Str::random(16)) und Passwort-Reset erzwingen
|
|
'email_verified_at' => $legacyUser->created_at, // oder ein anderer Zeitstempel
|
|
'created_at' => $legacyUser->created_at,
|
|
'updated_at' => $legacyUser->updated_at,
|
|
// ... weitere Felder mappen
|
|
]);
|
|
}
|
|
$progressBar->advance();
|
|
}
|
|
});
|
|
|
|
$progressBar->finish();
|
|
$this->newLine(2);
|
|
}
|
|
|
|
private function migrateArticles(int $brandId)
|
|
{
|
|
$this->line('Migrating articles...');
|
|
$progressBar = $this->output->createProgressBar(LegacyArticle::count());
|
|
$progressBar->start();
|
|
|
|
LegacyArticle::chunk(200, function ($legacyArticles) use ($brandId, $progressBar) {
|
|
foreach ($legacyArticles as $legacyArticle) {
|
|
// Den zugehörigen Nutzer in der NEUEN Datenbank finden
|
|
$author = NewUser::where('email', $legacyArticle->author_email)->first(); // Annahme: Artikel hat eine Autoren-E-Mail
|
|
|
|
if (! $author) {
|
|
$this->warn("Skipping article ID {$legacyArticle->id}, author with email {$legacyArticle->author_email} not found.");
|
|
|
|
continue; // Artikel überspringen, wenn kein Autor gefunden wurde
|
|
}
|
|
|
|
// Neuen Artikel in der zentralen DB erstellen
|
|
$newArticle = NewArticle::create([
|
|
'user_id' => $author->id,
|
|
'title' => $legacyArticle->title,
|
|
'slug' => $legacyArticle->slug, // oder neu generieren: Str::slug($legacyArticle->title)
|
|
'content' => $legacyArticle->body, // Spaltennamen anpassen
|
|
'created_at' => $legacyArticle->created_at,
|
|
'updated_at' => $legacyArticle->updated_at,
|
|
// ... weitere Felder mappen
|
|
]);
|
|
|
|
// Den Artikel mit der Plattform "Presseecho" verknüpfen
|
|
// Dies fügt den Eintrag in die Pivot-Tabelle `article_platform` ein
|
|
$newArticle->platforms()->attach($brandId, [
|
|
'status' => 'published', // oder den alten Status übernehmen
|
|
'published_at' => $legacyArticle->published_date,
|
|
// eventuell weitere Pivot-Daten
|
|
]);
|
|
|
|
$progressBar->advance();
|
|
}
|
|
});
|
|
|
|
$progressBar->finish();
|
|
$this->newLine(2);
|
|
}
|
|
}
|