修:分类显示「未分类」—— Task::find 没 JOIN 分类表 (#84)

用户 2026-11-05:「鸿蒙端的分类那个地方没带进来。明明是有分类的,
但是它却显示的是未分类。」

根因是**两个叠在一起**:

① `Task::find()` 的 SQL **没有 JOIN `task_categories`**
   `t.*` 里有 `category_id`,但没有 `category_name`;
   端上 `category: s(d.category_name)` 永远拿空串 ⇒ 显示「未分类」。
   同一个文件里 `doneList()` / 列表页那几条 SQL 都有这个 JOIN,
   只有 find() 漏了(写它不是同一时期,属于典型的"漏一处")。
   ⇒ 补 `LEFT JOIN task_categories c ON c.id = t.category_id`、选 `c.name AS category_name`。
   实测(#49 海大信息中心评审费):category_name = [工作相关] ✅

② `taskOut()` 里 `category_id => Api::int(category_id, ...)`
   `Api::int()` 是**读请求参数**的:先看 $_REQUEST 有没有该键,
   没有才用第二个参数当默认值。
   PATCH 时用户会传 ⇒ 值对;**GET 时没有请求参数** ⇒ 走默认值。
   这次默认值本身是从 `$t` 算的,所以"看起来是对的",
   但这种写法极易被误读成"已经取到表里的值了",后续改动容易出错。
   ⇒ 直接写 `(int)($t[category_id] ?? 0)`,不绕 Api::int。

注:`repeat_rule` 在 Task::find 里没被单独 SELECT ——
   但它在 `t.*` 里,`$t[repeat_rule]` 是有的(实测任务 #53 能正确读到/写入)。
This commit is contained in:
2026-11-05 20:19:36 +08:00
parent 50286e5327
commit 47a0027ef7
2 changed files with 51 additions and 3 deletions
+10
View File
@@ -557,12 +557,22 @@ final class Task
// 抛 PDOException: Unknown column 'p.name',而它又被 PHP 以
// "200 + Fatal error 正文"吐出来,看着像页面正常返回。
// 改 SQL 之后一定要用「真实库表结构」校验列名(见 sql-schema-column-check)。
/* 🔴 #84(用户 2026-11-05):「鸿蒙端的分类那个地方没带进来。
明明是有分类的,但是它却显示的是未分类。」
⇒ 补 `LEFT JOIN task_categories`。
原来这条 SQL **没有 JOIN 分类表**,虽然 `t.*` 里有 `category_id`,
但没有 `category_name` —— 端上 `category: s(d.category_name)`
永远拿到空串,于是显示成「未分类」。
(`doneList` / 详情页那几条 SQL 都有这个 JOIN,只有 find() 漏了。) */
'SELECT t.*, p.title AS parent_title,
c.name AS category_name,
a.name AS assignee_name, a.avatar AS assignee_avatar, a.avatar_color AS assignee_color,
na.nickname AS assignee_nick,
cr.name AS creator_name, cr.avatar AS creator_avatar, cr.avatar_color AS creator_color,
nc.nickname AS creator_nick
FROM tasks t
LEFT JOIN task_categories c ON c.id = t.category_id
LEFT JOIN tasks p ON p.id = t.parent_id
LEFT JOIN persons a ON a.id = t.assignee_id
LEFT JOIN nicknames na ON na.target_id = t.assignee_id AND na.viewer_id = ?