NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
All packages
Reports for Laravel

Resolving & rejecting

Resolve or reject through the facade to record the outcome:

Reports::resolve($report, by: $admin, note: 'Removed the post.');

// or

Reports::reject($report, by: $admin, note: 'Not a violation.');

Both record the resolver in resolved_by, the note in resolution_note and the time in resolved_at, move the status, and fire ReportStatusChanged followed by ReportResolved or ReportRejected.

The move is checked against the stored status first, under a row lock, and the status and resolution are written together — so an illegal move throws and writes nothing, and resolving an already-resolved report (or rejecting a rejected one) is a no-op that keeps the first decision and fires no second event.

Reading the outcome

Reports::resolve($report, by: $admin, note: 'Removed the post.');

$report->status;           // Status::Resolved
$report->resolvedBy;       // $admin
$report->resolution_note;  // 'Removed the post.'
$report->resolved_at;      // the moment it was settled

System actions

Both arguments are optional. Without a resolver, the report is settled with an empty resolved_by — useful for automated moderation, as long as no moderation request is open:

Reports::resolve($report);   // no resolver recorded

// or

Reports::reject($report, note: 'Auto-rejected: subject already removed.');

Transition rules still apply

Resolving and rejecting are status transitions, so they follow the table: both are allowed from Pending and InReview. A resolved report can be closed, and any settled report can be moved back to Pending for another decision:

// A resolved report can be closed…
Reports::close($report);

// …and any settled report can be reopened for another decision.
Reports::changeStatus($report, Status::Pending);
Reports::reject($report, by: $admin, note: 'On second review, not a violation.');

Reopening a settled report — back to Pending, or InReview — clears its resolver, note and resolved_at; closing a resolved report keeps them.

While a moderation request is open, resolve() and reject() record a named moderator’s decision instead of settling immediately, and refuse anyone else — see Multi-moderator moderation.

Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

More ways to support, including crypto

By donating, you agree to our donation terms.

Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.