order){ $video->order = static::max('order') + 1; } else { // Se definiu uma ordem já ocupada, empurra os outros static::where('order', '>=', $video->order) ->increment('order'); } }); static::updating(function ($video) { if ($video->isDirty('order')) { // ← só age se a ordem foi alterada $oldOrder = $video->getOriginal('order'); // ← ordem antiga $newOrder = $video->order; // ← ordem nova // Se a ordem for menor que 1, define como 1 if ($newOrder < 1) { $video->order = 1; $newOrder = 1; } if ($newOrder > $oldOrder) { // Moveu para baixo — fecha o espaço antigo static::where('order', '>', $oldOrder) ->where('order', '<=', $newOrder) ->decrement('order'); } else { // Moveu para cima — abre espaço na nova posição static::where('order', '>=', $newOrder) ->where('order', '<', $oldOrder) ->increment('order'); } } }); } // Converte o campo is_active para boolean protected $casts = [ 'is_active' => 'boolean', ]; // Um vídeo pode ter várias categorias public function categories() { return $this->belongsToMany(Category::class, 'video_category'); } // Um vídeo pode ter várias visualizações public function views() { return $this->hasMany(VideoView::class); } // Verifica se um vídeo foi assistido por um utilizador public function isWatchedBy(User $user): bool { return $this->views()->where('user_id', $user->id)->exists(); } }