fixed bug in sql triggers

This commit is contained in:
MonaHartdegen 2019-12-02 16:30:24 +01:00
parent e57cd8e552
commit 78a3c91c84
4 changed files with 63 additions and 49 deletions

View File

@ -15,13 +15,14 @@ class AddStoredFunctionToGetUrlPathOfCategory extends Migration
$functionSQL = <<< SQL
DROP FUNCTION IF EXISTS `get_url_path_of_category`;
CREATE FUNCTION get_url_path_of_category(
categoryId INT
categoryId INT,
localeCode VARCHAR(255)
)
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
DECLARE urlPath VARCHAR(255);
DECLARE urlPath VARCHAR(255);
IF categoryId != 1
THEN
SELECT
@ -35,6 +36,7 @@ class AddStoredFunctionToGetUrlPathOfCategory extends Migration
AND node._rgt <= parent._rgt
AND node.id = categoryId
AND parent.id <> 1
AND parent_translations.locale = localeCode
GROUP BY
node.id;

View File

@ -15,23 +15,22 @@ class AddTriggerToCategoryTranslations extends Migration
*/
public function up()
{
$insertTriggerBody = $this->getTriggerBody('insert');
$triggerBody = $this->getTriggerBody();
$insertTrigger = <<< SQL
CREATE TRIGGER %s
BEFORE INSERT ON category_translations
FOR EACH ROW
BEGIN
$insertTriggerBody
$triggerBody
END;
SQL;
$updateTriggerBody = $this->getTriggerBody();
$updateTrigger = <<< SQL
CREATE TRIGGER %s
BEFORE UPDATE ON category_translations
FOR EACH ROW
BEGIN
$updateTriggerBody
$triggerBody
END;
SQL;
@ -54,26 +53,21 @@ SQL;
}
/**
* Returns trigger body as string based on type ('update' or 'insert').
*
* @param string $type
* Returns trigger body as string
*
* @return string
*/
private function getTriggerBody(string $type = 'update'): string
private function getTriggerBody()
{
$addOnInsert = ($type === 'update') ? '' : <<< SQL
ELSE
SELECT CONCAT(urlPath, '/', NEW.slug) INTO urlPath;
SQL;
return <<< SQL
return <<<SQL
DECLARE parentUrlPath varchar(255);
DECLARE urlPath varchar(255);
IF NEW.category_id != 1
THEN
SELECT
GROUP_CONCAT(parent_translations.slug SEPARATOR '/') INTO urlPath
GROUP_CONCAT(parent_translations.slug SEPARATOR '/') INTO parentUrlPath
FROM
categories AS node,
categories AS parent
@ -81,19 +75,23 @@ SQL;
WHERE
node._lft >= parent._lft
AND node._rgt <= parent._rgt
AND node.id = NEW.category_id
AND node.id = (SELECT parent_id FROM categories WHERE id = NEW.category_id)
AND parent.id <> 1
AND parent_translations.locale = NEW.locale
GROUP BY
node.id;
IF urlPath IS NULL
IF parentUrlPath IS NULL
THEN
SET urlPath = NEW.slug;
$addOnInsert
ELSE
SET urlPath = concat(parentUrlPath, '/', NEW.slug);
END IF;
SET NEW.url_path = urlPath;
END IF;
SQL;
SQL;
}
}

View File

@ -13,27 +13,18 @@ class AddUrlPathToExistingCategoryTranslations extends Migration
*/
public function up()
{
$sql = <<< SQL
SELECT
GROUP_CONCAT(parent_translations.slug SEPARATOR '/') AS url_path
FROM
categories AS node,
categories AS parent
JOIN category_translations AS parent_translations ON parent.id = parent_translations.category_id
WHERE
node._lft >= parent._lft
AND node._rgt <= parent._rgt
AND node.id = :category_id
AND node.id <> 1
AND parent.id <> 1
GROUP BY
node.id
SQL;
$sqlStoredFunction = <<< SQL
SELECT get_url_path_of_category(:category_id, :locale_code) AS url_path;
SQL;
$categoryTranslationsTableName = app(CategoryTranslation::class)->getTable();
foreach (DB::table($categoryTranslationsTableName)->get() as $categoryTranslation) {
$urlPathQueryResult = DB::selectOne($sql, ['category_id' => $categoryTranslation->category_id]);
$urlPathQueryResult = DB::selectOne($sqlStoredFunction, [
'category_id' => $categoryTranslation->category_id,
'locale_code' => $categoryTranslation->locale,
]);
$url_path = $urlPathQueryResult ? $urlPathQueryResult->url_path : '';
DB::table($categoryTranslationsTableName)

View File

@ -17,16 +17,39 @@ class AddTriggerToCategories extends Migration
{
$triggerBody = <<< SQL
DECLARE urlPath VARCHAR(255);
DECLARE localeCode VARCHAR(255);
DECLARE done INT;
DECLARE curs CURSOR FOR (SELECT category_translations.locale
FROM category_translations
WHERE category_id = NEW.id);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SELECT get_url_path_of_category(NEW.id) INTO urlPath;
IF EXISTS (SELECT * FROM category_translations WHERE category_id = NEW.id)
IF EXISTS (
SELECT *
FROM category_translations
WHERE category_id = NEW.id
)
THEN
UPDATE category_translations
SET url_path = urlPath
WHERE category_translations.category_id = NEW.id;
OPEN curs;
SET done = 0;
REPEAT
FETCH curs INTO localeCode;
SELECT get_url_path_of_category(NEW.id, localeCode) INTO urlPath;
UPDATE category_translations
SET url_path = urlPath
WHERE category_translations.category_id = NEW.id;
UNTIL done END REPEAT;
CLOSE curs;
END IF;
SQL;
SQL;
$insertTrigger = <<< SQL
CREATE TRIGGER %s
@ -35,7 +58,7 @@ SQL;
BEGIN
$triggerBody
END;
SQL;
SQL;
$updateTrigger = <<< SQL
CREATE TRIGGER %s
@ -44,7 +67,7 @@ SQL;
BEGIN
$triggerBody
END;
SQL;
SQL;
DB::unprepared(sprintf('DROP TRIGGER IF EXISTS %s;', self::TRIGGER_NAME_INSERT));
DB::unprepared(sprintf($insertTrigger, self::TRIGGER_NAME_INSERT));