buildQuery() ->field('notice.id,notice.user_id,notice.title,notice.content,notice.scene_id,notice.read,notice.extra,notice.create_time,user.nickname AS user_nickname,user.account AS user_account') ->order('notice.id desc') ->limit($this->limitOffset, $this->limitLength) ->select() ->toArray(); $sourceUserIds = []; foreach ($lists as $item) { $extra = UserNoticeService::decodeExtra($item['extra'] ?? ''); if (!empty($extra['source_user_id'])) { $sourceUserIds[] = (int) $extra['source_user_id']; } } $sourceUsers = []; $sourceUserIds = array_values(array_unique(array_filter($sourceUserIds))); if (!empty($sourceUserIds)) { $sourceUsers = User::whereIn('id', $sourceUserIds)->column('nickname', 'id'); } foreach ($lists as &$item) { $extra = UserNoticeService::decodeExtra($item['extra'] ?? ''); $meta = UserNoticeEnum::getMeta((int) $item['scene_id']); $sourceUserId = (int) ($extra['source_user_id'] ?? 0); $item['type_desc'] = $meta['type_desc']; $item['source_user_id'] = $sourceUserId; $item['source_nickname'] = $sourceUsers[$sourceUserId] ?? ''; $item['target_url'] = UserNoticeService::sanitizeTargetUrl((string) ($extra['target_url'] ?? '')); $item['create_time'] = is_numeric($item['create_time']) ? date('Y-m-d H:i:s', (int) $item['create_time']) : $item['create_time']; } unset($item); return $lists; } public function count(): int { return $this->buildQuery()->count(); } private function buildQuery() { $query = NoticeRecord::alias('notice') ->leftJoin('user user', 'user.id = notice.user_id') ->whereIn('notice.scene_id', UserNoticeEnum::getSceneIds()); $sceneId = (int) ($this->params['scene_id'] ?? 0); if (in_array($sceneId, UserNoticeEnum::getSceneIds(), true)) { $query->where('notice.scene_id', $sceneId); } if (array_key_exists('read', $this->params) && $this->params['read'] !== '') { $query->where('notice.read', (int) $this->params['read']); } $keyword = trim((string) ($this->params['keyword'] ?? '')); if ($keyword !== '') { $query->where(function ($query) use ($keyword) { $query->whereLike('notice.title', '%' . $keyword . '%') ->whereOr('notice.content', 'like', '%' . $keyword . '%') ->whereOr('user.nickname', 'like', '%' . $keyword . '%') ->whereOr('user.account', 'like', '%' . $keyword . '%'); }); } return $query; } }