. */ namespace App\Models; use App\Traits\SlugTrait; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Database\Eloquent\SoftDeletes; use Venturecraft\Revisionable\RevisionableTrait; /** * App\Models\Genre. * * @property int $id * @property string $name * @property string $slug * @property string $deleted_at * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Track[] $tracks * @property-read \App\Models\Track $trackCountRelation * @property-read mixed $track_count * @property-read mixed $url * @property-write mixed $title * @property-read \Illuminate\Database\Eloquent\Collection|\Venturecraft\Revisionable\Revision[] $revisionHistory * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre whereId($value) * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre whereName($value) * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre whereSlug($value) * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre whereDeletedAt($value) * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre whereUpdatedAt($value) * @mixin \Eloquent * @method static bool|null forceDelete() * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre onlyTrashed() * @method static bool|null restore() * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre withTrashed() * @method static \Illuminate\Database\Query\Builder|\App\Models\Genre withoutTrashed() */ class Genre extends Model { use HasFactory; protected $fillable = ['name', 'slug']; protected $appends = ['track_count', 'url']; protected $hidden = ['trackCountRelation']; use SlugTrait, SoftDeletes, RevisionableTrait; public function tracks() { return $this->hasMany(Track::class, 'genre_id'); } /** * "Dummy" relation to facilitate eager-loading of a genre's track count. * This relationship should not be used directly. * * Inspired by {@link http://softonsofa.com/tweaking-eloquent-relations-how-to-get-hasmany-relation-count-efficiently/} * * @return Relation */ public function trackCountRelation() { return $this->hasOne(Track::class) ->select(['genre_id', DB::raw('count(*) as track_count')]) ->groupBy('genre_id'); } /** * Returns the number of tracks in this genre. * * @return int */ public function getTrackCountAttribute() { if (! $this->relationLoaded('trackCountRelation')) { $this->load('trackCountRelation'); } return $this->trackCountRelation ? $this->trackCountRelation->track_count : 0; } /** * @return string relative, Angular-friendly URL to this genre */ public function getUrlAttribute() { return route('tracks.discover', ['filter' => "genres-{$this->id}"], false); } }