protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messageTable, $removeUnused, $languages, $markUnused)
{
$q = new \yii\db\Query();
$current = [];
foreach ($q->select(['id', 'category', 'message'])->from($sourceMessageTable)->all($db) as $row) {
$current[$row['category']][$row['id']] = $row['message'];
}
$new = [];
$obsolete = [];
foreach ($messages as $category => $msgs) {
$msgs = array_unique($msgs);
if (isset($current[$category])) {
$new[$category] = array_diff($msgs, $current[$category]);
$obsolete += array_diff($current[$category], $msgs);
} else {
$new[$category] = $msgs;
}
}
foreach (array_diff(array_keys($current), array_keys($messages)) as $category) {
$obsolete += $current[$category];
}
if (!$removeUnused) {
foreach ($obsolete as $pk => $m) {
if (mb_substr($m, 0, 2) === '@@' && mb_substr($m, -2) === '@@') {
unset($obsolete[$pk]);
}
}
}
$obsolete = array_keys($obsolete);
$this->stdout('Inserting new messages...');
$savedFlag = false;
foreach ($new as $category => $msgs) {
foreach ($msgs as $m) {
$savedFlag = true;
$lastPk = $db->schema->insert($sourceMessageTable, ['category' => $category, 'message' => $m]);
foreach ($languages as $language) {
$db->createCommand()->insert($messageTable, ['id' => $lastPk['id'], 'language' => $language])->execute();
}
}
}
$this->stdout($savedFlag ? "saved.\n" : "Nothing new...skipped.\n");
$this->stdout($removeUnused ? 'Deleting obsoleted messages...' : 'Updating obsoleted messages...');
if (empty($obsolete)) {
$this->stdout("Nothing obsoleted...skipped.\n");
} else {
if ($removeUnused) {
$db->createCommand()->delete($sourceMessageTable, ['in', 'id', $obsolete])->execute();
$this->stdout("deleted.\n");
} elseif ($markUnused) {
$db->createCommand()->update($sourceMessageTable, ['message' => new \yii\db\Expression("CONCAT('@@',message,'@@')")], ['in', 'id', $obsolete])->execute();
$this->stdout("updated.\n");
} else {
$this->stdout("kept untouched.\n");
}
}
}