blog-app/seed.php
2021-11-13 14:19:55 +08:00

169 lines
4.2 KiB
PHP

<?php
require 'vendor/autoload.php';
const NUM_OF_COMMENTS = 200;
const NUM_OF_POSTS = 100;
const NUM_OF_TAGS_CANDIDATE = 30;
const NUM_OF_USERS = 10;
const USER_PASSWORD = '1234';
$config = (new Core\Config)->get('database');
$db = new Core\Database\QueryBuilder(
new PDO(
"{$config['connection']};charset=utf8",
$config['username'],
$config['password'],
$config['options']
)
);
$schema = file_get_contents('schema.sql');
$sql = $db->prepare($schema);
$sql->execute();
$faker = Faker\Factory::create();
$rows = [];
$holders = [];
$usernames = [];
for ($i = 0; $i < NUM_OF_USERS; $i += 1) {
array_push($usernames, $faker->unique()->userName);
}
for ($i = 0; $i < NUM_OF_USERS; $i += 1) {
array_push(
$rows,
$usernames[$i],
$faker->unique()->freeEmail,
password_hash(USER_PASSWORD, PASSWORD_DEFAULT)
);
array_push($holders, '(NULL,?,?,?)');
}
$sql = $db->prepare('INSERT INTO users VALUES ' . implode(', ', $holders));
$sql->execute($rows);
$rows = [];
$holders = [];
$datetimes = [];
$from = NUM_OF_POSTS + 3;
for ($i = 0; $i < NUM_OF_POSTS; $i += 1) {
array_push(
$datetimes,
$faker->unique()
->dateTimeBetween("-{$from} days", '-3 days')
->format('Y-m-d H:i:s')
);
}
sort($datetimes);
$mh = curl_multi_init();
for ($i = 0; $i < NUM_OF_POSTS; $i += 1) {
$fetchURL = 'https://jaspervdj.be/lorem-markdownum/markdown.txt';
$multiCurl[$i] = curl_init();
curl_setopt($multiCurl[$i], CURLOPT_URL, $fetchURL);
curl_setopt($multiCurl[$i], CURLOPT_HEADER, 0);
curl_setopt($multiCurl[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $multiCurl[$i]);
}
$index = null;
do {
curl_multi_exec($mh, $index);
} while ($index > 0);
for ($i = 0; $i < NUM_OF_POSTS; $i += 1) {
$r = $faker->numberBetween(0, 9);
array_push(
$rows,
implode(' ', array_slice(explode(' ', $faker->unique()->realText()), 0, 6)),
curl_multi_getcontent($multiCurl[$i]),
$usernames[$r],
$datetimes[$i],
$datetimes[$i]
);
array_push($holders, '(NULL,?,?,?,?,?)');
curl_multi_remove_handle($mh, $multiCurl[$i]);
}
curl_multi_close($mh);
$sql = $db->prepare('INSERT INTO posts VALUES ' . implode(', ', $holders));
$sql->execute($rows);
$rows = [];
$holders = [];
$cdatetimes = [];
$cposts = [];
for ($i = 0; $i < NUM_OF_COMMENTS; $i += 1) {
$p = $faker->numberBetween(0, NUM_OF_POSTS - 1);
$d = $faker->numberBetween(0, 1);
$h = $faker->numberBetween(0, 23);
$m = $faker->numberBetween(0, 59);
$s = $faker->numberBetween(0, 59);
array_push(
$cdatetimes,
date_create_from_format('Y-m-d H:i:s', $datetimes[$p])
->add(new DateInterval("P{$d}DT{$h}H{$m}M{$s}S"))
->format('Y-m-d H:i:s')
);
array_push($cposts, $p + 1);
}
array_multisort($cdatetimes, $cposts);
for ($i = 0; $i < NUM_OF_COMMENTS; $i += 1) {
$r = $faker->numberBetween(0, NUM_OF_USERS - 1);
array_push(
$rows,
$faker->unique()->realText(100, 1),
$usernames[$r],
$cdatetimes[$i],
$cdatetimes[$i],
$cposts[$i]
);
array_push($holders, '(NULL,?,?,?,?,?)');
}
$sql = $db->prepare('INSERT INTO comments VALUES ' . implode(', ', $holders));
$sql->execute($rows);
$rows = [];
$holders = [];
$tags = array_values(array_unique($faker->words(NUM_OF_TAGS_CANDIDATE)));
$num_of_tags = count($tags);
for ($i = 0; $i < $num_of_tags; $i += 1) {
array_push($rows, null, $tags[$i]);
array_push($holders, '(?,?)');
}
$sql = $db->prepare('INSERT INTO tags VALUES ' . implode(', ', $holders));
$sql->execute($rows);
$rows = [];
$holders = [];
$links = [];
for ($i = 0; $i < 4 * NUM_OF_POSTS; $i += 1) {
$p = $faker->numberBetween(1, NUM_OF_POSTS);
$t = $faker->numberBetween(1, $num_of_tags);
array_push($links, [$p, $t]);
}
$rows = array_values(array_unique($links, SORT_REGULAR));
sort($rows);
for ($i = 0; $i < count($rows); $i += 1) {
array_push($holders, '(?,?)');
}
$sql = $db->prepare('INSERT INTO post_tag VALUES ' . implode(', ', $holders));
$sql->execute(call_user_func_array('array_merge', $rows));
echo "Done!\n";