Просмотр файла app/Models/Article.php

Размер файла: 4.66Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Models;
  6.  
  7. use App\Traits\UploadTrait;
  8. use Exception;
  9. use Illuminate\Database\Eloquent\Collection;
  10. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  11. use Illuminate\Database\Eloquent\Relations\HasMany;
  12. use Illuminate\Database\Eloquent\Relations\MorphMany;
  13. use Illuminate\Database\Eloquent\Relations\MorphOne;
  14.  
  15. /**
  16. * Class Article
  17. *
  18. * @property int id
  19. * @property int category_id
  20. * @property int user_id
  21. * @property string title
  22. * @property string text
  23. * @property string tags
  24. * @property int rating
  25. * @property int visits
  26. * @property int count_comments
  27. * @property int created_at
  28. * @property Collection files
  29. * @property Blog category
  30. */
  31. class Article extends BaseModel
  32. {
  33. use UploadTrait;
  34.  
  35. /**
  36. * Indicates if the model should be timestamped.
  37. *
  38. * @var bool
  39. */
  40. public $timestamps = false;
  41.  
  42. /**
  43. * The attributes that aren't mass assignable.
  44. *
  45. * @var array
  46. */
  47. protected $guarded = [];
  48.  
  49. /**
  50. * Директория загрузки файлов
  51. *
  52. * @var string
  53. */
  54. public $uploadPath = UPLOADS . '/articles';
  55.  
  56. /**
  57. * Counting field
  58. *
  59. * @var string
  60. */
  61. public $countingField = 'visits';
  62.  
  63. /**
  64. * Morph name
  65. *
  66. * @var string
  67. */
  68. public static $morphName = 'articles';
  69.  
  70. /**
  71. * Возвращает комментарии блогов
  72. *
  73. * @return MorphMany
  74. */
  75. public function comments(): MorphMany
  76. {
  77. return $this->morphMany(Comment::class, 'relate')->with('relate');
  78. }
  79.  
  80. /**
  81. * Возвращает последнии комментарии к статье
  82. *
  83. * @param int $limit
  84. * @return HasMany
  85. */
  86. public function lastComments(int $limit = 15): HasMany
  87. {
  88. return $this->hasMany(Comment::class, 'relate_id')
  89. ->where('relate_type', self::$morphName)
  90. ->orderBy('created_at', 'desc')
  91. ->with('user')
  92. ->limit($limit);
  93. }
  94.  
  95. /**
  96. * Возвращает связь категории блога
  97. *
  98. * @return BelongsTo
  99. */
  100. public function category(): BelongsTo
  101. {
  102. return $this->belongsTo(Blog::class, 'category_id')->withDefault();
  103. }
  104.  
  105. /**
  106. * Возвращает загруженные файлы
  107. *
  108. * @return MorphMany
  109. */
  110. public function files(): MorphMany
  111. {
  112. return $this->morphMany(File::class, 'relate');
  113. }
  114.  
  115. /**
  116. * Возвращает связь с голосованием
  117. *
  118. * @return morphOne
  119. */
  120. public function polling(): morphOne
  121. {
  122. return $this->morphOne(Polling::class, 'relate')->where('user_id', getUser('id'));
  123. }
  124.  
  125. /**
  126. * Возвращает путь к первому файлу
  127. *
  128. * @return mixed код изображения
  129. */
  130. public function getFirstImage()
  131. {
  132. $image = $this->files->first();
  133.  
  134. if (! $image) {
  135. return null;
  136. }
  137.  
  138. return '<img src="' . $image->hash . '" atl="' . $this->title . '" class="card-img-top">';
  139. }
  140.  
  141. /**
  142. * Возвращает сокращенный текст статьи
  143. *
  144. * @param int $words
  145. *
  146. * @return string
  147. */
  148. public function shortText(int $words = 100): string
  149. {
  150. $more = view('app/_more', ['link' => '/articles/'. $this->id]);
  151.  
  152. if (strpos($this->text, '[cut]') !== false) {
  153. $this->text = bbCode(current(explode('[cut]', $this->text)));
  154. } else {
  155. $this->text = bbCodeTruncate($this->text, $words);
  156. }
  157.  
  158. return $this->text . $more;
  159. }
  160.  
  161. /**
  162. * Возвращает размер шрифта для облака тегов
  163. *
  164. * @param int $count
  165. * @param float $minCount
  166. * @param float $maxCount
  167. * @param int $minSize
  168. * @param int $maxSize
  169. *
  170. * @return int
  171. */
  172. public static function logTagSize($count, $minCount, $maxCount, $minSize = 10, $maxSize = 30): int
  173. {
  174. $minCount = log($minCount + 1);
  175. $maxCount = log($maxCount + 1);
  176.  
  177. $diffSize = $maxSize - $minSize;
  178. $diffCount = $maxCount - $minCount;
  179.  
  180. if (empty($diffCount)) {
  181. $diffCount = 1;
  182. }
  183.  
  184. return (int) round($minSize + (log(1 + $count) - $minCount) * ($diffSize / $diffCount));
  185. }
  186.  
  187. /**
  188. * Удаление статьи и загруженных файлов
  189. *
  190. * @return bool|null
  191. * @throws Exception
  192. */
  193. public function delete(): ?bool
  194. {
  195. $this->files->each(static function (File $file) {
  196. $file->delete();
  197. });
  198.  
  199. return parent::delete();
  200. }
  201. }