PostRepositories.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: edz
  5. * Date: 2019-06-10
  6. * Time: 17:53
  7. */
  8. namespace App\Repositories;
  9. use App\Models\Behavior;
  10. use App\Models\Post;
  11. use App\Models\PostCollect;
  12. use App\Models\PostData;
  13. use App\Models\PostLike;
  14. use Illuminate\Support\Facades\Log;
  15. use Illuminate\Support\Facades\Redis;
  16. class PostRepositories
  17. {
  18. public function __construct(Post $post)
  19. {
  20. $this->post = $post;
  21. }
  22. /**
  23. * 推荐内容列表
  24. */
  25. public function suggestPost($request)
  26. {
  27. $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
  28. $where = [];
  29. if(isset($request['content'])){
  30. $where[] = ['content', 'like', "%{$request['content']}%"];
  31. }
  32. if(isset($request['is_suggest'])){
  33. $where[] = ['is_suggest', $request['is_suggest']];
  34. }
  35. if(isset($request['type'])){
  36. $where[] = ['type', $request['type']];
  37. }
  38. if(isset($request['uid'])){
  39. $where[] = ['uid', $request['uid']];
  40. }
  41. $sort = 'post.id';
  42. if(isset($request['sort']) && in_array($request['sort'], ['praise_count', 'share_count', 'pv', 'comment_count', 'create_bean'])){
  43. $sort = $request['sort'];
  44. }
  45. return $this->post
  46. ->join('post_data', 'post_data.post_id', '=', 'post.id')
  47. ->select('post.*')
  48. ->where($where)
  49. ->where(function($query) use ($request){
  50. if(isset($request['keyword'])){
  51. $query->where('uid', '=', $request['keyword'])
  52. ->orWhere('username', 'like', "%{$request['keyword']}%")
  53. ->orWhere('mobile', 'like', "%{$request['keyword']}%");
  54. }
  55. })
  56. ->where(function($query) use ($request){
  57. if(isset($request['created_at'])){
  58. $time = explode('_', $request['created_at']);
  59. $query->whereBetween('post.created_at', $time);
  60. }
  61. })
  62. ->where(function ($query) use ($request){
  63. if(isset($request['category_ids']) || isset($request['topic_ids'])){
  64. $ids = [];
  65. if (isset($request['category_ids'])) {
  66. $categoryIds = explode('_', $request['category_ids']);
  67. $ids = $this->categoryTopic->whereIn('category_id', $categoryIds)->pluck('topic_id')->toArray();
  68. }
  69. if (isset($request['topic_ids'])) {
  70. $ids = array_merge($ids, explode('_', $request['topic_ids']));
  71. }
  72. foreach ($ids as $key=>$id) {
  73. if ($key==0) {
  74. $query = $query->whereRaw('FIND_IN_SET('.$id.',topic_ids)');
  75. } else {
  76. $query = $query->orWhereRaw('FIND_IN_SET('.$id.',topic_ids)');
  77. }
  78. }
  79. }
  80. })
  81. ->orderBy($sort,'desc')
  82. ->paginate($perPage);
  83. }
  84. /**
  85. * 更新帖子统计数量
  86. * @param $request
  87. * @return mixed
  88. */
  89. public function updatePostData($request)
  90. {
  91. $postId = $request['post_id'];
  92. $post = PostData::where('post_id', $postId)->first();
  93. if (isset($request['behavior_flag']) && $request['behavior_flag'] == 'read') {
  94. $post->pv += 1;
  95. $post->pv_real += 1;
  96. } elseif (isset($request['behavior_flag']) && $request['behavior_flag'] == 'unlike') {
  97. $post->dislike += 1;
  98. } elseif (isset($request['behavior_flag']) && $request['behavior_flag'] == 'like') {
  99. if($request['behavior_value']){
  100. $post->praise_count += 1;
  101. $post->praise_real_count += 1;
  102. PostLike::create(['uid'=>$request['target_id'],'post_id'=>$request['post_id']]);
  103. }else{
  104. $post->praise_count -= 1;
  105. $post->praise_real_count -= 1;
  106. PostLike::where(['uid'=>$request['target_id'],'post_id'=>$request['post_id']])->delete();
  107. }
  108. } elseif (isset($request['behavior_flag']) && $request['behavior_flag'] == 'forward') {
  109. $post->share_count += 1;
  110. $post->share_real_count += 1;
  111. } elseif (isset($request['behavior_flag']) && $request['behavior_flag'] == 'comment') {
  112. $post->comment_count += 1;
  113. } elseif (isset($request['behavior_flag']) && $request['behavior_flag'] == 'collect') {
  114. if($request['behavior_value']) {
  115. $post->collect_count += 1;
  116. $post->collect_real_count += 1;
  117. PostCollect::create(['uid'=>$request['target_id'],'post_id'=>$request['post_id']]);
  118. }else{
  119. $post->collect_count -= 1;
  120. $post->collect_real_count -= 1;
  121. PostCollect::where(['uid'=>$request['target_id'],'post_id'=>$request['post_id']])->delete();
  122. }
  123. }
  124. return $post->save();
  125. }
  126. /**
  127. * 收集所有有操作的帖子,存入redis
  128. * 供后续计算帖子权重
  129. * @param $id
  130. */
  131. public function collectPostId($id)
  132. {
  133. $key = "community_calc_post_score";
  134. Redis::sadd($key,$id);
  135. }
  136. }