diff --git a/app/Console/Commands/SyncArticleLikes.php b/app/Console/Commands/SyncArticleLikes.php index fa3adca9..06e313e9 100755 --- a/app/Console/Commands/SyncArticleLikes.php +++ b/app/Console/Commands/SyncArticleLikes.php @@ -73,9 +73,13 @@ private function transferLikes(Articles $oArticle, string $sField, int $iAmount) { $iRealAdd = min($oArticle->$sField, $iAmount); if ($iRealAdd > 0) { - $oArticle->increment('iLikeCount', $iRealAdd); + $oArticle->increment('iLikeCount', $iRealAdd, [ + 'sLastLikedAt' => now(), // 这里的 now() 是 Laravel 提供的 Carbon 实例 + ]); // 这里注意:increment/decrement 会同步更新 model 对象的内存值 $oArticle->decrement($sField, $iRealAdd); +// $oArticle->sLastLikedAt = time(); +// $oArticle->save(); } } } diff --git a/app/Services/ArticlesService.php b/app/Services/ArticlesService.php index 4d5aeef1..8b6ab5d7 100755 --- a/app/Services/ArticlesService.php +++ b/app/Services/ArticlesService.php @@ -118,7 +118,11 @@ public function like(int $iArticleId, string $sIp, string $sFingerprint): array // 执行增加并直接获取最新的模型实例 $oArticle = Articles::where('id', $iArticleId); - $oArticle->increment('iLikeCount'); + $oArticle->increment('iLikeCount', 1, [ + 'sLastLikedAt' => now(), // 这里的 now() 是 Laravel 提供的 Carbon 实例 + ]); + $oArticle->sLastLikedAt = time(); +// $oArticle->save(); // 不对吗 // 拿到自增后的最新数字 $iNewLikeCount = $oArticle->value('iLikeCount'); @@ -133,6 +137,7 @@ public function like(int $iArticleId, string $sIp, string $sFingerprint): array 'iLikeCount' => $iNewLikeCount // 药水哥绝杀:把热腾腾的数字发回去 ]; } catch (\Exception $e) { +// tt($e->getMessage()); \Log::error("点赞失败: " . $e->getMessage()); return ['status' => false, 'code' => 500, 'msg' => '系统打了个盹,稍后再试。']; } diff --git a/app/Services/CacheService.php b/app/Services/CacheService.php index bfe887b9..a3d6070f 100755 --- a/app/Services/CacheService.php +++ b/app/Services/CacheService.php @@ -36,33 +36,57 @@ class CacheService // return $aHotArticles; // } +// public static function updateOrderLikes_old(): array +// { +// // 1. 获取最近点赞的文章ID流 +// // 使用 max(id) 或 max(created_at) 来确保每个文章只出现一次,且取的是它最后一次被点赞的时间 +// $aHotArticles = ArticleLikes::select('iArticleId', \DB::raw('MAX(created_at) as sLatestLikeTime')) +// ->whereHas('oArticle', function($oQuery) { +// $oQuery->where('iStatus', 1); // 只看发布状态的文章 +// }) +// ->groupBy('iArticleId') +// ->orderBy('sLatestLikeTime', 'desc') // 按最后一次点赞时间倒序 +// ->limit(10) +// ->with('oArticle') // 预加载文章详情 +// ->get() +// ->map(function($oItem) { +// // 格式化输出,把文章对象和点赞时间揉在一起 +// return [ +// 'iArticleId' => $oItem->iArticleId, +// 'sLatestLikeTime' => $oItem->sLatestLikeTime, +// 'oArticle' => $oItem->oArticle +// ]; +// }) +// ->toArray(); +// +// // 2. 存入缓存 +// Cache::forever(self::CACHE_KEYS['article_order_likes'], $aHotArticles); +// +// return $aHotArticles; +// } // 真正问题在这里。这里生成缓存视图,是基于ArticleLikes,与刚才的代码脱节 + public static function updateOrderLikes(): array { - // 1. 获取最近点赞的文章ID流 - // 使用 max(id) 或 max(created_at) 来确保每个文章只出现一次,且取的是它最后一次被点赞的时间 - $aHotArticles = ArticleLikes::select('iArticleId', \DB::raw('MAX(created_at) as sLatestLikeTime')) - ->whereHas('oArticle', function($oQuery) { - $oQuery->where('iStatus', 1); // 只看发布状态的文章 - }) - ->groupBy('iArticleId') - ->orderBy('sLatestLikeTime', 'desc') // 按最后一次点赞时间倒序 + // 1. 基于 Articles 表按最后点赞时间倒序,涵盖真实赞与算法注入赞 + $cArticles = Articles::where('iStatus', 1) + ->whereNotNull('sLastLikedAt') + ->orderBy('sLastLikedAt', 'desc') ->limit(10) - ->with('oArticle') // 预加载文章详情 - ->get() - ->map(function($oItem) { - // 格式化输出,把文章对象和点赞时间揉在一起 - return [ - 'iArticleId' => $oItem->iArticleId, - 'sLatestLikeTime' => $oItem->sLatestLikeTime, - 'oArticle' => $oItem->oArticle - ]; - }) - ->toArray(); + ->get(); - // 2. 存入缓存 + // 2. 构造与原结构完全一致的返回数组 + $aHotArticles = $cArticles->map(function ($oArticle) { + return [ + 'iArticleId' => $oArticle->id, + 'sLatestLikeTime' => $oArticle->sLastLikedAt, + 'oArticle' => $oArticle, + ]; + })->toArray(); +//tt($aHotArticles); + // 3. 存入缓存 Cache::forever(self::CACHE_KEYS['article_order_likes'], $aHotArticles); return $aHotArticles; } - + } diff --git a/routes/console.php b/routes/console.php index 1ada7865..748b8ceb 100755 --- a/routes/console.php +++ b/routes/console.php @@ -44,7 +44,7 @@ })->purpose('定点爆破并重建指定的表,不带参数不动手'); // 每周一凌晨 2:00 准时开跑,避开流量高峰 -Schedule::command('stat:tags-cloud')->weeklyOn(1, '02:00'); +Schedule::command('stat:tags-cloud')->weeklyOn(1, '02:00'); // 没到时间我想测试,如何直接触发 //Schedule::command('stat:order-likes')->hourly();