Files
clinicpro/data/seed_finish.php
T
hamed 28dbfa67e2 Add seed script for populating database with initial data
- Implemented a comprehensive PHP script to seed the database with test data for users, doctors, clinics, appointments, payments, ratings, comments, and blogs.
- Included functions for generating random data such as UUIDs, mobile numbers, and images.
- Downloaded and stored images for doctors and clinics using parallel curl requests.
- Inserted static data for insurances, patients, and doctors with various attributes including specialties and services.
- Ensured data integrity by disabling foreign key checks during the seeding process and re-enabling them afterward.
- Provided a summary of the total records inserted into each table at the end of the script.
2026-06-10 15:06:37 +03:30

127 lines
11 KiB
PHP

<?php
declare(strict_types=1);
set_time_limit(0);
$pdo = new PDO('mysql:host=db;dbname=db;charset=utf8mb4', 'db', 'db');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMES utf8mb4');
$now = time();
function uuid(): string {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0,0xffff),mt_rand(0,0xffff),mt_rand(0,0xffff),
mt_rand(0,0x0fff)|0x4000,mt_rand(0,0x3fff)|0x8000,
mt_rand(0,0xffff),mt_rand(0,0xffff),mt_rand(0,0xffff));
}
function ri(array $a) { return $a[array_rand($a)]; }
function wRand(array $items, array $weights): mixed {
$total = array_sum($weights); $r = rand(1, $total); $c = 0;
foreach ($items as $k => $v) { $c += $weights[$k]; if ($r <= $c) return $v; }
return $items[0];
}
// Load existing IDs
$doctorIds = $pdo->query('SELECT id FROM doctors')->fetchAll(PDO::FETCH_COLUMN);
$patientIds = $pdo->query("SELECT id FROM users WHERE roles NOT LIKE '%ROLE_DOCTOR%' AND roles NOT LIKE '%ROLE_ADMIN%'")->fetchAll(PDO::FETCH_COLUMN);
echo 'Doctors: ' . count($doctorIds) . ', Patients: ' . count($patientIds) . "\n";
// ── Ratings ───────────────────────────────────────────────────────────────────
echo "Inserting ratings...\n";
$rateStmt = $pdo->prepare('INSERT INTO rates (uuid,score,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?)');
$usedPairs = [];
$rateCount = 0;
$pdo->beginTransaction();
$tries = 0;
while ($rateCount < 3000 && $tries < 30000) {
$tries++;
$doctorId = ri($doctorIds);
$userId = ri($patientIds);
$key = $userId . '-' . $doctorId;
if (isset($usedPairs[$key])) continue;
$usedPairs[$key] = true;
$score = wRand([1,2,3,4,5], [3,5,15,35,42]);
$ts = $now - rand(3600, 86400 * 400);
$rateStmt->execute([uuid(), $score, $ts, $ts, $userId, $doctorId]);
$rateCount++;
if ($rateCount % 1000 === 0) { $pdo->commit(); $pdo->beginTransaction(); echo " $rateCount\n"; }
}
$pdo->commit();
echo "Ratings: $rateCount\n";
// ── Comments ──────────────────────────────────────────────────────────────────
echo "Inserting comments...\n";
$comTexts = [
'دکتر بسیار دلسوز و با حوصله هستند. توضیحات کامل دادند.',
'معاینه دقیق بود. تشخیص درست و درمان موثر. ممنونم.',
'وقت انتظار کم بود و کیفیت ویزیت عالی.',
'بسیار متبحر و باتجربه. مشکلم حل شد.',
'رفتار حرفه‌ای و انسانی. مطب تمیز و منظم. توصیه می‌کنم.',
'ویزیت خوبی داشتم. دارو‌ها موثر بود.',
'یکی از بهترین پزشکانی که دیده‌ام. صبور و دقیق.',
'کمی صبر کردم ولی ارزشش داشت. وقت کافی گذاشت.',
'متخصص واقعی. همه سوالات را صادقانه جواب داد.',
'رزرو آسان و ویزیت به موقع. کاملاً راضی هستم.',
'برخورد محترمانه و تخصص بالا. حتماً دوباره مراجعه می‌کنم.',
'اطلاعات دقیق و مشاوره عالی. بهترین انتخاب بود.',
];
$comStmt = $pdo->prepare('INSERT INTO comments (uuid,body,status,created_at,updated_at,user_id,doctor_id) VALUES (?,?,?,?,?,?,?)');
$comStatuses = ['approved','approved','approved','approved','pending','rejected'];
$pdo->beginTransaction();
for ($i = 0; $i < 2000; $i++) {
$ts = $now - rand(3600, 86400 * 400);
$comStmt->execute([uuid(), ri($comTexts), ri($comStatuses), $ts, $ts, ri($patientIds), ri($doctorIds)]);
if (($i+1) % 500 === 0) { $pdo->commit(); $pdo->beginTransaction(); echo " Comments: " . ($i+1) . "\n"; }
}
$pdo->commit();
echo "Comments: 2000\n";
// ── Blogs ─────────────────────────────────────────────────────────────────────
echo "Inserting blogs...\n";
$blogStmt = $pdo->prepare('INSERT INTO blogs (uuid,title,slug,body,summary,tags,status,created_at,updated_at,author_id) VALUES (?,?,?,?,?,?,?,?,?,?)');
$blogData = [
['راهنمای جامع پیشگیری از بیماری‌های قلبی','heart-disease-prevention','بیماری‌های قلبی از علل اصلی مرگ هستند. با تغذیه سالم، ورزش منظم، ترک سیگار و کنترل فشار خون می‌توان خطر ابتلا را کاهش داد.',['قلب','پیشگیری','سلامت'],'published'],
['تغذیه سالم برای کودکان در سنین رشد','healthy-nutrition-children','مصرف متعادل پروتئین، لبنیات، میوه و سبزیجات برای رشد کودکان ضروری است.',['کودکان','تغذیه','رشد'],'published'],
['اهمیت چکاپ منظم سالانه','annual-checkup','آزمایش خون، فشار خون و غربالگری سرطان باید سالانه انجام شوند. تشخیص زودهنگام درمان را ساده‌تر می‌کند.',['چکاپ','پیشگیری'],'published'],
['مدیریت استرس در زندگی مدرن','stress-management','تنفس عمیق، مدیتیشن، ورزش و ارتباط اجتماعی سالم از راهکارهای موثر مدیریت استرس هستند.',['استرس','سلامت روان'],'published'],
['دیابت نوع ۲: علائم و کنترل','diabetes-type2','تشنگی زیاد، ادرار مکرر و خستگی از علائم دیابت هستند. رژیم مناسب و ورزش در مدیریت آن حیاتی است.',['دیابت','قند خون'],'published'],
['نقش ورزش در سلامت قلب','exercise-cardiovascular','۱۵۰ دقیقه فعالیت هوازی در هفته برای سلامت قلب ضروری است.',['ورزش','قلب'],'published'],
['خواب کافی و سلامت روان','sleep-health','بزرگسالان به ۷-۹ ساعت خواب نیاز دارند. کمبود خواب با بیماری‌های مزمن ارتباط دارد.',['خواب','سلامت'],'published'],
['مراقبت از پوست در برابر آفتاب','skin-care-sun','استفاده از کرم ضدآفتاب SPF 30+ و پوشش مناسب از پوست محافظت می‌کند.',['پوست','ضدآفتاب'],'published'],
['پیشگیری از پوکی استخوان','osteoporosis','مصرف کلسیم، ویتامین D و ورزش منظم از پوکی استخوان جلوگیری می‌کنند.',['استخوان','کلسیم'],'published'],
['مراقبت از بینایی','eye-care','معاینه سالانه چشم و رعایت قانون ۲۰-۲۰-۲۰ برای سلامت چشم ضروری است.',['چشم','بینایی'],'published'],
['سرطان پستان؛ تشخیص زودهنگام','breast-cancer','معاینه خودآزمایی ماهانه و ماموگرافی سالانه از ابزارهای تشخیص زودهنگام هستند.',['سرطان','پستان'],'published'],
['بهداشت دهان و دندان','dental-hygiene','مسواک زدن دو بار در روز و مراجعه به دندانپزشک هر ۶ ماه توصیه می‌شود.',['دندان','بهداشت'],'published'],
['کنترل فشار خون بالا','blood-pressure','کاهش نمک، ورزش منظم و مصرف داروها در کنترل فشار خون موثر هستند.',['فشار خون','قلب'],'published'],
['واکسیناسیون بزرگسالان','adult-vaccination','آنفلوانزا، هپاتیت B و واکسن HPV از واکسن‌های مهم بزرگسالی هستند.',['واکسن','پیشگیری'],'published'],
['آرتروز زانو: درمان و بازتوانی','knee-arthritis','فیزیوتراپی، ورزش‌های تقویتی و کاهش وزن در درمان آرتروز زانو موثر هستند.',['آرتروز','ارتوپدی'],'published'],
['تغذیه در بیماری‌های کلیوی','renal-diet','رژیم کم‌پتاسیم و کم‌فسفر برای بیماران کلیوی ضروری است.',['کلیه','تغذیه'],'draft'],
['سلامت روان در محیط کار','workplace-mental-health','تعادل کار و زندگی و ارتباط موثر با همکاران از عوامل سلامت روان در کار هستند.',['سلامت روان','کار'],'published'],
['آلرژی فصلی','seasonal-allergy','اجتناب از محرک‌ها و استفاده از آنتی‌هیستامین از روش‌های اصلی مقابله با آلرژی هستند.',['آلرژی','تنفس'],'published'],
['ورزش در دوران بارداری','pregnancy-exercise','پیاده‌روی و یوگای بارداری با نظر پزشک برای مادر و جنین مفید است.',['بارداری','ورزش'],'published'],
['پیشگیری از سرطان روده','colorectal-cancer','کولونوسکوپی از سن ۴۵ سالگی و رژیم پرفیبر خطر را کاهش می‌دهند.',['سرطان','روده'],'published'],
];
$adminRow = $pdo->query("SELECT id FROM users WHERE roles LIKE '%ROLE_ADMIN%' LIMIT 1")->fetch(PDO::FETCH_ASSOC);
$adminId = $adminRow ? $adminRow['id'] : ri($doctorIds);
foreach ($blogData as $b) {
$ts = $now - rand(86400, 86400 * 300);
$blogStmt->execute([
uuid(), $b[0], $b[1] . '-' . rand(100,999), $b[2],
mb_substr($b[2], 0, 200), json_encode($b[3], JSON_UNESCAPED_UNICODE),
$b[4], $ts, $ts, $adminId
]);
}
echo 'Blogs: ' . count($blogData) . "\n";
// ── Summary ───────────────────────────────────────────────────────────────────
echo "\n=== Final counts ===\n";
$tables = ['users','doctors','clinics','clinic_doctors','clinic_specialties','clinic_services','clinic_insurances',
'doctor_specialties','doctor_expertise','doctor_provinces','doctor_cities','doctor_addresses',
'appointments','payments','rates','comments','blogs','insurances','profiles'];
$total = 0;
foreach ($tables as $t) {
$c = (int)$pdo->query("SELECT COUNT(*) FROM `$t`")->fetchColumn();
printf(" %-30s %d\n", $t . ':', $c);
$total += $c;
}
echo "\nTotal records: $total\n";