'boolean', 'release_date' => 'date', 'rejected_at' => 'datetime', ]; public function scopePublished( Builder $query ): Builder { return $query->where( 'state', 'published' ); } public function scopeInQueue( Builder $query, int $daysRejected = 7 ): Builder { return $query->withTrashed()->where(function($q) use($daysRejected) { $q->where('state', 'pending')->whereNull('deleted_at'); })->orWhere(function($q) use($daysRejected) { $q->where('state', 'rejected')->whereNotNull('rejected_at')->where('rejected_at', '>=', now()->subDays($daysRejected) ); }); } /** * Return game link. * @return BelongsTo */ public function game(): BelongsTo { return $this->belongsTo(Game::class); } public function platform(): BelongsTo { return $this->belongsTo(Platform::class); } public function getRealPlatform(): ?Platform { return $this->game?->platform ?? $this->platform; } public function status(): BelongsTo { return $this->belongsTo(Status::class ); } public function authors(): BelongsToMany { return $this->belongsToMany(Author::class, 'entry_authors'); } public function languages(): BelongsToMany { return $this->belongsToMany(Language::class, 'entry_languages'); } public function modifications(): BelongsToMany { return $this->belongsToMany( Modification::class, 'entry_modifications'); } public function files(): HasMany { return $this->hasMany(EntryFile::class)->orderBy('filename'); } public function gallery(): HasMany { return $this->hasMany(EntryGallery::class)->orderBy('id'); } public function hashes(): HasMany { return $this->hasMany(EntryHash::class); } public function parseStaffCredits(): array { return json_decode( $this->staff_credits ?? "", true ); } public function getYoutubeVideoId(): ?string { if( !$this->youtube_link ) return null; $pattern = '%(?:https?://)?(?:www\.|m\.)?(?:youtu\.be/|youtube(?:-nocookie)?\.com/(?:watch\?.*v=|embed/|v/|shorts/|live/))([\w-]{11})%i'; preg_match($pattern, $this->youtube_link, $matches); return $matches[1] ?? null; } }