LiuJ 1 ماه پیش
والد
کامیت
1a398f0f98
1فایلهای تغییر یافته به همراه60 افزوده شده و 23 حذف شده
  1. 60 23
      app/JsonRpc/NewsService.php

+ 60 - 23
app/JsonRpc/NewsService.php

@@ -425,37 +425,69 @@ class NewsService implements NewsServiceInterface
     if ($type_id != 10000) {
       $where[] = ['article.admin_user_id', '=', $user_id];
     }
-
-    $rep = Article::where($where)
-      ->whereNotIn('article.status', [404])
-      ->when($status1, function ($query) use ($status1) {
-        if (isset($status1) && $status1) {
-          $query->whereIn('article.status', $status1);
+    $startTime = microtime(true);
+    $rep = Article::query()
+      // 预加载相关关联
+      ->with([
+        'category' => function ($query) {
+          $query->select('id', 'name');
+        },
+        'websiteCategory' => function ($query) {
+          $query->select('website_id', 'category_id', 'alias');
         }
+      ])
+      // 构建where条件
+      ->when(isset($data['id']) && $data['id'], function ($query) use ($data) {
+        $query->where('article.id', '=', $data['id']);
       })
-      ->leftJoin('category', 'article.catid', 'category.id')
-      ->leftJoin('website_category', function ($join) {
-        $join->on('article.web_site_id', '=', 'website_category.website_id')
-          ->on('article.catid', '=', 'website_category.category_id');
+      ->when(isset($data['title']) && $data['title'], function ($query) use ($data) {
+        $query->where('article.title', 'like', '%' . $data['title'] . '%');
       })
-      ->select("article.*", "category.name as category_name", "website_category.alias")
-      ->orderBy("article.updated_at", "desc")
-      ->limit($data['pageSize'])
-      ->offset(($data['page'] - 1) * $data['pageSize'])->get();
-    $count = Article::where($where)->whereNotIn('article.status', [404])
-      ->when($status1, function ($query) use ($status1) {
-        if (isset($status1) && $status1) {
+      ->when(isset($data['category_name']) && $data['category_name'], function ($query) use ($data) {
+        // 使用子查询替代左连接进行模糊搜索
+        $query->whereHas('category', function ($subQuery) use ($data) {
+          $subQuery->where('name', 'like', '%' . $data['category_name'] . '%');
+        });
+      })
+      ->when(isset($data['catid']) && $data['catid'], function ($query) use ($data) {
+        $query->where('article.catid', '=', $data['catid']);
+      })
+      ->when(isset($data['author']) && $data['author'], function ($query) use ($data) {
+        $query->where('article.author', '=', $data['author']);
+      })
+      ->when(isset($data['islink']) && $data['islink'] !== "", function ($query) use ($data) {
+        $query->where('article.islink', '=', $data['islink']);
+      })
+      ->when(isset($data['status']) && $data['status'] !== "", function ($query) use ($data) {
+        $query->where('article.status', '=', $data['status']);
+      })
+      ->when(isset($data['status1']) && $data['status1'], function ($query) use ($data) {
+        // 安全地处理JSON字符串
+        $status1 = is_array($data['status1']) ? $data['status1'] : json_decode($data['status1'], true)  ?? [];
+        if (!empty($status1)) {
           $query->whereIn('article.status', $status1);
         }
       })
-      ->leftJoin('category', 'article.catid', 'category.id')->count();
+      // 非管理员限制
+      ->when($type_id != 10000, function ($query) use ($user_id) {
+        $query->where('article.admin_user_id', '=', $user_id);
+      })
+      // 基础条件
+      ->whereNotIn('article.status', [404])
+      // 排序和分页
+      ->orderBy('article.updated_at', 'desc')
+      ->paginate($data['pageSize'], ["article.*"]);
+
+    // 获取结果并格式化
     $data = [
-      'rows' => $rep->toArray(),
-      'count' => $count,
+      'rows' => $rep->items(),
+      'count' => $rep->total(),
     ];
-    if (empty($rep)) {
-      return Result::error("没有信息数据");
-    }
+    // 执行查询
+    $endTime = microtime(true);
+    $executionTime = ($endTime - $startTime) * 1000;
+
+    echo "查询执行时间: {$executionTime}ms\n";
     return Result::success($data);
   }
 
@@ -4318,6 +4350,8 @@ class NewsService implements NewsServiceInterface
     date_default_timezone_set('Asia/Shanghai');
     $data['created_at'] = date('Y-m-d H:i:s');
     $data['updated_at'] = date('Y-m-d H:i:s');
+    // $data['level'] = "1,2,3,4,5";
+    $level = json_decode($data['level'], true);
     $user_id = UserInfo::
       //city_id不是null
       whereNotNull('city_id')
@@ -4332,6 +4366,9 @@ class NewsService implements NewsServiceInterface
           $subQuery->whereRaw("JSON_VALID(department_arr_id) AND JSON_CONTAINS(department_arr_id, '" . intval($data['department_id']) . "') = 1");
         });
       })
+      ->when(isset($level) && is_array($level), function ($query) use ($level) {
+        $query->whereIn('level', $level);
+      })
       ->pluck('user_id')->toArray();
     $user_id = array_unique($user_id);
     $chat_ids = $user_id;