Article.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. namespace App\Models;
  3. use App\Models\Relations\BelongsToCategoryTrait;
  4. use App\Models\Relations\BelongsToUserTrait;
  5. use App\Models\Relations\MorphManyCommentsTrait;
  6. use App\Models\Relations\MorphManyTagsTrait;
  7. use Carbon\Carbon;
  8. use Illuminate\Database\Eloquent\Model;
  9. use Illuminate\Support\Facades\App;
  10. class Article extends Model
  11. {
  12. use BelongsToUserTrait,MorphManyTagsTrait,MorphManyCommentsTrait,BelongsToCategoryTrait;
  13. protected $table = 'articles';
  14. protected $fillable = ['title', 'user_id','category_id', 'content','tags','summary','status','logo'];
  15. public static function boot()
  16. {
  17. parent::boot();
  18. /*监听创建*/
  19. static::creating(function($article){
  20. /*开启状态检查*/
  21. if(Setting()->get('verify_article')==1){
  22. $article->status = 0;
  23. }
  24. if( trim($article->summary) === '' ){
  25. $article->summary = str_limit(strip_tags($article->content),180);
  26. }
  27. });
  28. static::saved(function($article){
  29. if(Setting()->get('xunsearch_open',0) == 1){
  30. App::offsetGet('search')->update($article);
  31. }
  32. });
  33. /*监听删除事件*/
  34. static::deleting(function($article){
  35. /*用户文章数 -1 */
  36. $article->user->userData()->where("articles",">",0)->decrement('articles');
  37. Collection::where('source_type','=',get_class($article))->where('source_id','=',$article->id)->delete();
  38. /*删除回答评论*/
  39. Comment::where('source_type','=',get_class($article))->where('source_id','=',$article->id)->delete();
  40. /*删除动态*/
  41. Doing::where('source_type','=',get_class($article))->where('source_id','=',$article->id)->delete();
  42. });
  43. static::deleted(function($article){
  44. if(Setting()->get('xunsearch_open',0) == 1){
  45. App::offsetGet('search')->delete($article);
  46. }
  47. });
  48. }
  49. /*获取相关文章*/
  50. public static function correlations($tagIds,$size=6)
  51. {
  52. $questions = self::whereHas('tags', function($query) use ($tagIds) {
  53. $query->whereIn('tag_id', $tagIds);
  54. })->orderBy('created_at','DESC')->take($size)->get();
  55. return $questions;
  56. }
  57. /*搜索*/
  58. public static function search($word,$size=16)
  59. {
  60. $list = self::where('title','like',"$word%")->paginate($size);
  61. return $list;
  62. }
  63. /*推荐文章*/
  64. public static function recommended($categoryId=0 , $pageSize=20)
  65. {
  66. $query = self::query();
  67. $category = Category::findFromCache($categoryId);
  68. if( $category ){
  69. $query->whereIn('category_id',$category->getSubIds());
  70. }
  71. $list = $query->where('status','>',0)->orderBy('supports','DESC')->orderBy('created_at','DESC')->paginate($pageSize);
  72. return $list;
  73. }
  74. /*热门文章*/
  75. public static function hottest($categoryId=0 , $pageSize=20)
  76. {
  77. $query = self::query();
  78. $category = Category::findFromCache($categoryId);
  79. if( $category ){
  80. $query->whereIn('category_id',$category->getSubIds());
  81. }
  82. if(Setting()->get('hot_content_period',365)){
  83. $query->where('created_at', ">" , Carbon::now()->subDays(Setting()->get('hot_content_period',365)));
  84. }
  85. $list = $query->where('status','>',0)->orderBy('views','DESC')->orderBy('collections','DESC')->orderBy('created_at','DESC')->paginate($pageSize);
  86. return $list;
  87. }
  88. /*最新问题*/
  89. public static function newest($categoryId=0 , $pageSize=20)
  90. {
  91. $query = self::query();
  92. $category = Category::findFromCache($categoryId);
  93. if( $category ){
  94. $query->whereIn('category_id',$category->getSubIds());
  95. }
  96. $list = $query->where('status','>',0)->orderBy('created_at','DESC')->paginate($pageSize);
  97. return $list;
  98. }
  99. }