perf: mysql递归查询兼容处理

This commit is contained in:
2025-07-10 17:30:01 +08:00
parent 9ac90d3fef
commit b0d241c22e
6 changed files with 139 additions and 54 deletions

View File

@@ -8,6 +8,7 @@ DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE
DB_PORT = 3306 DB_PORT = 3306
DB_CHARSET = utf8mb4 DB_CHARSET = utf8mb4
DB_PREFIX = ow_ DB_PREFIX = ow_
DB_VERSION = 8
DEFAULT_LANG = zh-cn DEFAULT_LANG = zh-cn

View File

@@ -64,7 +64,10 @@ class ArticleCategoryValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new ArticleCategoryModel)->getTable(); $table_name = (new ArticleCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query( $children = Db::query(
preg_replace( preg_replace(
'/\s+/u', '/\s+/u',
@@ -77,6 +80,20 @@ class ArticleCategoryValidate extends Validate
SELECT id FROM article_tree_by WHERE id <> {$data['id']};" SELECT id FROM article_tree_by WHERE id <> {$data['id']};"
) )
); );
} else {
$children = \think\facade\Db::query("
SELECT t2.id
FROM (
SELECT
@r AS _id, (SELECT @r := GROUP_CONCAT(id) FROM $table_name WHERE FIND_IN_SET(pid, _id)) AS parent_id
FROM
(SELECT @r := {$data['id']}) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -49,7 +49,10 @@ class AttachmentCategoryValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new AttachmentCategoryModel)->getTable(); $table_name = (new AttachmentCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query( $children = Db::query(
preg_replace( preg_replace(
'/\s+/u', '/\s+/u',
@@ -62,6 +65,20 @@ class AttachmentCategoryValidate extends Validate
SELECT id FROM attachment_tree_by WHERE id <> {$data['id']};" SELECT id FROM attachment_tree_by WHERE id <> {$data['id']};"
) )
); );
} else {
$children = \think\facade\Db::query("
SELECT t2.id
FROM (
SELECT
@r AS _id, (SELECT @r := GROUP_CONCAT(id) FROM $table_name WHERE FIND_IN_SET(pid, _id)) AS parent_id
FROM
(SELECT @r := {$data['id']}) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -61,7 +61,10 @@ class NavigationItemValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new SysNavigationItemModel)->getTable(); $table_name = (new SysNavigationItemModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query( $children = Db::query(
preg_replace( preg_replace(
'/\s+/u', '/\s+/u',
@@ -74,6 +77,20 @@ class NavigationItemValidate extends Validate
SELECT id FROM tree_by WHERE id <> {$data['id']};" SELECT id FROM tree_by WHERE id <> {$data['id']};"
) )
); );
} else {
$children = \think\facade\Db::query("
SELECT t2.id
FROM (
SELECT
@r AS _id, (SELECT @r := GROUP_CONCAT(id) FROM $table_name WHERE FIND_IN_SET(pid, _id)) AS parent_id
FROM
(SELECT @r := {$data['id']}) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -74,7 +74,10 @@ class SysMenuValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new SysMenuModel)->getTable(); $table_name = (new SysMenuModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query( $children = Db::query(
preg_replace( preg_replace(
'/\s+/u', '/\s+/u',
@@ -87,6 +90,20 @@ class SysMenuValidate extends Validate
SELECT id FROM menu_tree_by WHERE id <> {$data['id']};" SELECT id FROM menu_tree_by WHERE id <> {$data['id']};"
) )
); );
} else {
$children = \think\facade\Db::query("
SELECT t2.id
FROM (
SELECT
@r AS _id, (SELECT @r := GROUP_CONCAT(id) FROM $table_name WHERE FIND_IN_SET(pid, _id)) AS parent_id
FROM
(SELECT @r := {$data['id']}) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -274,7 +274,9 @@ class TopicNas extends Common
->value('id'); ->value('id');
// 获取帮且中心分类子分类 // 获取帮且中心分类子分类
$categorys = [];
$table_name = (new ArticleCategoryModel)->getTable(); $table_name = (new ArticleCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$categorys = \think\facade\Db::query(preg_replace( $categorys = \think\facade\Db::query(preg_replace(
'/\s+/u', '/\s+/u',
' ', ' ',
@@ -285,6 +287,20 @@ class TopicNas extends Common
) )
SELECT id FROM article_tree_by WHERE id <> {$parent}" SELECT id FROM article_tree_by WHERE id <> {$parent}"
)); ));
} else {
$categorys = \think\facade\Db::query("
SELECT t2.id
FROM (
SELECT
@r AS _id, (SELECT @r := GROUP_CONCAT(id) FROM $table_name WHERE FIND_IN_SET(pid, _id)) AS parent_id
FROM
(SELECT @r := $parent) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (empty($categorys)) return success('success', []); if (empty($categorys)) return success('success', []);
// 获取文章数据 // 获取文章数据