feat(data-import): Add data import script for provinces, cities, specialties, and doctor services
- Implemented a PHP script to import data from JSON files into the database. - Added functionality to truncate and clear existing data in relevant tables. - Inserted provinces, cities, specialties (including parent-child relationships), and doctor services from JSON files. - Updated foreign key checks and reset AUTO_INCREMENT values for relevant tables. - Added JSON files for provinces, cities, and specialties. chore(migrations): Update cities table to allow longtext for keywords - Modified the `keywords` column in the `cities` table to change its type from VARCHAR(255) to LONGTEXT.
This commit is contained in:
+114
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
try {
|
||||
$pdo = new PDO('mysql:host=db;dbname=db;charset=utf8mb4', 'db', 'db');
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
|
||||
$base = '/var/www/html/data';
|
||||
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
|
||||
$pdo->exec('SET NAMES utf8mb4');
|
||||
|
||||
// ── Clear dependent pivot tables ──────────────────────────────────────────
|
||||
foreach (['doctor_provinces', 'doctor_cities', 'doctor_specialties', 'doctor_expertise', 'clinic_specialties', 'clinic_services', 'clinic_insurances'] as $t) {
|
||||
$pdo->exec("TRUNCATE TABLE `$t`");
|
||||
echo "Truncated $t\n";
|
||||
}
|
||||
|
||||
// Clear location FKs on clinics
|
||||
$pdo->exec('UPDATE clinics SET province_id = NULL, city_id = NULL');
|
||||
|
||||
// ── Clear main tables ─────────────────────────────────────────────────────
|
||||
foreach (['doctor_services', 'specialties', 'cities', 'provinces'] as $t) {
|
||||
$pdo->exec("DELETE FROM `$t`");
|
||||
echo "Cleared $t\n";
|
||||
}
|
||||
|
||||
// ── 1. Provinces ──────────────────────────────────────────────────────────
|
||||
$states = json_decode(file_get_contents("$base/state.json"), true);
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO provinces (id, uuid, name, status, weight) VALUES (?, UUID(), ?, 1, ?)'
|
||||
);
|
||||
foreach ($states as $i => $s) {
|
||||
$stmt->execute([(int)$s['id'], $s['name'], ($i + 1) * 10]);
|
||||
}
|
||||
echo 'Inserted ' . count($states) . " provinces\n";
|
||||
|
||||
// ── 2. Cities ─────────────────────────────────────────────────────────────
|
||||
$cities = json_decode(file_get_contents("$base/city.json"), true);
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO cities (id, uuid, name, status, weight, province_id, email, slogan, domain,
|
||||
description, keywords, contact_phone, social_media, footer_description)
|
||||
VALUES (?, UUID(), ?, 1, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
||||
);
|
||||
foreach ($cities as $c) {
|
||||
$social = isset($c['socialMedia']) ? json_encode($c['socialMedia'], JSON_UNESCAPED_UNICODE) : null;
|
||||
$stmt->execute([
|
||||
(int)$c['id'],
|
||||
$c['name'],
|
||||
isset($c['province_id']) ? (int)$c['province_id'] : null,
|
||||
$c['email'] ?? null,
|
||||
$c['slogan'] ?? null,
|
||||
$c['domain'] ?? null,
|
||||
$c['description'] ?? null,
|
||||
$c['keywords'] ?? null,
|
||||
$c['contactPhone'] ?? null,
|
||||
$social,
|
||||
$c['footerDescription'] ?? null,
|
||||
]);
|
||||
}
|
||||
echo 'Inserted ' . count($cities) . " cities\n";
|
||||
|
||||
// ── 3. Specialties (parents first, then children) ─────────────────────────
|
||||
$specialties = json_decode(file_get_contents("$base/specialties.json"), true);
|
||||
$parents = array_values(array_filter($specialties, fn($s) => $s['parent'] === null));
|
||||
$children = array_values(array_filter($specialties, fn($s) => $s['parent'] !== null));
|
||||
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO specialties (id, uuid, name, slug, status, weight, parent_id)
|
||||
VALUES (?, UUID(), ?, ?, 1, ?, ?)'
|
||||
);
|
||||
foreach ($parents as $i => $s) {
|
||||
$stmt->execute([(int)$s['id'], $s['name'], $s['slug'], ($i + 1) * 10, null]);
|
||||
}
|
||||
foreach ($children as $i => $s) {
|
||||
$stmt->execute([(int)$s['id'], $s['name'], $s['slug'], ($i + 1) * 10, (int)$s['parent']]);
|
||||
}
|
||||
echo 'Inserted ' . count($specialties) . " specialties (" . count($parents) . " root + " . count($children) . " children)\n";
|
||||
|
||||
// ── 4. Doctor services ────────────────────────────────────────────────────
|
||||
$services = json_decode(file_get_contents("$base/doctor_services.json"), true);
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO doctor_services (id, uuid, name, slug, status, weight, specialty_id)
|
||||
VALUES (?, UUID(), ?, ?, 1, ?, ?)'
|
||||
);
|
||||
foreach ($services as $i => $s) {
|
||||
$stmt->execute([
|
||||
(int)$s['id'],
|
||||
$s['name'],
|
||||
$s['slug'],
|
||||
($i + 1) * 10,
|
||||
isset($s['specialty_id']) ? (int)$s['specialty_id'] : null,
|
||||
]);
|
||||
}
|
||||
echo 'Inserted ' . count($services) . " doctor_services\n";
|
||||
|
||||
// ── Fix AUTO_INCREMENT ────────────────────────────────────────────────────
|
||||
$pdo->exec('ALTER TABLE provinces AUTO_INCREMENT = 200');
|
||||
$pdo->exec('ALTER TABLE cities AUTO_INCREMENT = 2000');
|
||||
$pdo->exec('ALTER TABLE specialties AUTO_INCREMENT = 500');
|
||||
$pdo->exec('ALTER TABLE doctor_services AUTO_INCREMENT = 30000');
|
||||
|
||||
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
|
||||
|
||||
echo "\nDone! Summary:\n";
|
||||
foreach (['provinces', 'cities', 'specialties', 'doctor_services'] as $t) {
|
||||
$cnt = $pdo->query("SELECT COUNT(*) FROM `$t`")->fetchColumn();
|
||||
echo " $t: $cnt rows\n";
|
||||
}
|
||||
|
||||
} catch (Throwable $e) {
|
||||
echo 'ERROR: ' . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user