From 343a77ec73a10d557ee6be9bf59a725c631455fd Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Thu, 10 Jul 2025 17:30:01 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20mysql=E9=80=92=E5=BD=92=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=85=BC=E5=AE=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .example.env | 1 + .../validate/v1/ArticleCategoryValidate.php | 39 +++++++++++++------ .../v1/AttachmentCategoryValidate.php | 39 +++++++++++++------ .../validate/v1/NavigationItemValidate.php | 39 +++++++++++++------ app/admin/validate/v1/SysMenuValidate.php | 39 +++++++++++++------ app/index/controller/TopicNas.php | 36 ++++++++++++----- 6 files changed, 139 insertions(+), 54 deletions(-) diff --git a/.example.env b/.example.env index b6a1a52b..9f004047 100644 --- a/.example.env +++ b/.example.env @@ -8,6 +8,7 @@ DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE DB_PORT = 3306 DB_CHARSET = utf8mb4 DB_PREFIX = ow_ +DB_VERSION = 8 DEFAULT_LANG = zh-cn diff --git a/app/admin/validate/v1/ArticleCategoryValidate.php b/app/admin/validate/v1/ArticleCategoryValidate.php index b818684d..9813c7d1 100644 --- a/app/admin/validate/v1/ArticleCategoryValidate.php +++ b/app/admin/validate/v1/ArticleCategoryValidate.php @@ -64,19 +64,36 @@ class ArticleCategoryValidate extends Validate if ($value == 0) { return true; } + + $children = []; $table_name = (new ArticleCategoryModel)->getTable(); - $children = Db::query( - preg_replace( - '/\s+/u', - ' ', - "WITH RECURSIVE article_tree_by AS ( - SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} - UNION ALL - SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid + if (env('DB_VERSION', '5') == '8') { + $children = Db::query( + preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE article_tree_by AS ( + SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} + UNION ALL + SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid + ) + 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'))) { return false; } diff --git a/app/admin/validate/v1/AttachmentCategoryValidate.php b/app/admin/validate/v1/AttachmentCategoryValidate.php index dbfa1139..b9c34cd7 100644 --- a/app/admin/validate/v1/AttachmentCategoryValidate.php +++ b/app/admin/validate/v1/AttachmentCategoryValidate.php @@ -49,19 +49,36 @@ class AttachmentCategoryValidate extends Validate if ($value == 0) { return true; } + + $children = []; $table_name = (new AttachmentCategoryModel)->getTable(); - $children = Db::query( - preg_replace( - '/\s+/u', - ' ', - "WITH RECURSIVE attachment_tree_by AS ( - SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} - UNION ALL - SELECT k.id, k.pid FROM $table_name k INNER JOIN attachment_tree_by t ON t.id = k.pid + if (env('DB_VERSION', '5') == '8') { + $children = Db::query( + preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE attachment_tree_by AS ( + SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} + UNION ALL + SELECT k.id, k.pid FROM $table_name k INNER JOIN attachment_tree_by t ON t.id = k.pid + ) + 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'))) { return false; } diff --git a/app/admin/validate/v1/NavigationItemValidate.php b/app/admin/validate/v1/NavigationItemValidate.php index 70bdae9c..ee3e7c7e 100644 --- a/app/admin/validate/v1/NavigationItemValidate.php +++ b/app/admin/validate/v1/NavigationItemValidate.php @@ -61,19 +61,36 @@ class NavigationItemValidate extends Validate if ($value == 0) { return true; } + + $children = []; $table_name = (new SysNavigationItemModel)->getTable(); - $children = Db::query( - preg_replace( - '/\s+/u', - ' ', - "WITH RECURSIVE tree_by AS ( - SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} - UNION ALL - SELECT k.id, k.pid FROM $table_name k INNER JOIN tree_by t ON t.id = k.pid + if (env('DB_VERSION', '5') == '8') { + $children = Db::query( + preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE tree_by AS ( + SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} + UNION ALL + SELECT k.id, k.pid FROM $table_name k INNER JOIN tree_by t ON t.id = k.pid + ) + 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'))) { return false; } diff --git a/app/admin/validate/v1/SysMenuValidate.php b/app/admin/validate/v1/SysMenuValidate.php index 9d9eaede..a0af1921 100644 --- a/app/admin/validate/v1/SysMenuValidate.php +++ b/app/admin/validate/v1/SysMenuValidate.php @@ -74,19 +74,36 @@ class SysMenuValidate extends Validate if ($value == 0) { return true; } + + $children = []; $table_name = (new SysMenuModel)->getTable(); - $children = Db::query( - preg_replace( - '/\s+/u', - ' ', - "WITH RECURSIVE menu_tree_by AS ( - SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} - UNION ALL - SELECT k.id, k.pid FROM $table_name k INNER JOIN menu_tree_by t ON t.id = k.pid + if (env('DB_VERSION', '5') == '8') { + $children = Db::query( + preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE menu_tree_by AS ( + SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} + UNION ALL + SELECT k.id, k.pid FROM $table_name k INNER JOIN menu_tree_by t ON t.id = k.pid + ) + 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'))) { return false; } diff --git a/app/index/controller/TopicNas.php b/app/index/controller/TopicNas.php index 0d2add82..19b3e834 100644 --- a/app/index/controller/TopicNas.php +++ b/app/index/controller/TopicNas.php @@ -274,17 +274,33 @@ class TopicNas extends Common ->value('id'); // 获取帮且中心分类子分类 + $categorys = []; $table_name = (new ArticleCategoryModel)->getTable(); - $categorys = \think\facade\Db::query(preg_replace( - '/\s+/u', - ' ', - "WITH RECURSIVE article_tree_by AS ( - SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$parent} - UNION ALL - SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid - ) - SELECT id FROM article_tree_by WHERE id <> {$parent}" - )); + if (env('DB_VERSION', '5') == '8') { + $categorys = \think\facade\Db::query(preg_replace( + '/\s+/u', + ' ', + "WITH RECURSIVE article_tree_by AS ( + SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$parent} + UNION ALL + SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid + ) + 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', []); // 获取文章数据