$userId, 'news_id' => $newsId, 'is_canceled' => 0, // 未取消收藏 ]; $favorite = self::where($where)->find(); return $favorite ? $favorite->toArray() : false; } /** * 添加收藏 * @param int $userId 用户ID * @param int $newsId 新闻ID * @return bool|array 收藏结果 */ public static function addFavorite($userId, $newsId) { // 检查是否已收藏 $favorite = self::where([ 'user_id' => $userId, 'news_id' => $newsId, ])->find(); if ($favorite) { // 已收藏但被取消,则恢复收藏 if ($favorite['is_canceled'] == 1) { $favorite->is_canceled = 0; $favorite->cancel_time = null; $favorite->create_time = date('Y-m-d H:i:s'); $favorite->save(); return $favorite->toArray(); } // 已收藏未取消,返回已存在 return $favorite->toArray(); } // 新增收藏 $model = new self(); $model->user_id = $userId; $model->news_id = $newsId; $model->is_canceled = 0; $model->save(); return $model->toArray(); } /** * 取消收藏 * @param int $userId 用户ID * @param int $newsId 新闻ID * @return bool 取消结果 */ public static function cancelFavorite($userId, $newsId) { $favorite = self::where([ 'user_id' => $userId, 'news_id' => $newsId, 'is_canceled' => 0, ])->find(); if (!$favorite) { return false; } $favorite->is_canceled = 1; $favorite->cancel_time = date('Y-m-d H:i:s'); return $favorite->save() !== false; } /** * 获取用户收藏列表 * @param int $userId 用户ID * @param int $page 页码 * @param int $limit 每页条数 * @return array 收藏列表 */ public static function getUserFavoriteList($userId, $page = 1, $limit = 10) { $where = [ 'user_id' => $userId, 'is_canceled' => 0, ]; $list = self::where($where) ->with(['news' => function ($query) { $query->field('id,title,cover_image,publish_time,author_name'); }]) ->page($page, $limit) ->order('create_time', 'desc') ->select() ->toArray(); return $list; } /** * 关联新闻表 * @return \think\model\relation\HasOne */ public function news() { return $this->hasOne(News::class, 'id', 'news_id'); } }