- 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.
127 lines
11 KiB
PHP
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";
|