Skip to main content

Reaction Model

The Reaction model represents a user's or device's reaction (like, dislike, love, etc.) on any reactable model. This model supports polymorphic relations for both the reacting entity (reactor) and the target entity (reactable).

Namespace​

JobMetric\Reaction\Models\Reaction

Overview​

The Reaction model stores all reactions in the application. It uses polymorphic relationships to work with any Eloquent model, supports soft deletes, and includes automatic pruning capabilities.

Properties​

Reactor Type​

public string|null $reactor_type;

The class name of the reacting user (polymorphic). Can be null for anonymous reactions.

Reactor ID​

public int|null $reactor_id;

The ID of the reacting user (polymorphic). Can be null for anonymous reactions.

Reactable Type​

public string $reactable_type;

The class name of the target model being reacted to.

Reactable ID​

public int $reactable_id;

The ID of the target model being reacted to.

Reaction​

public string $reaction;

The type of reaction (e.g., 'like', 'dislike', 'love', 'angry', 'sad').

IP​

public string|null $ip;

The IP address from which the reaction was made.

Device ID​

public string|null $device_id;

Optional device identifier for anonymous reactions.

Source​

public string|null $source;

Optional source indicator (e.g., 'web', 'app', 'api').

Relationships​

Reactor​

Get the model that made the reaction:

$reaction->reactor; // User, Admin, etc. or null

Returns: Model|null - The reactor model or null for anonymous reactions

Reactable​

Get the model that was reacted to:

$reaction->reactable; // Article, Post, Comment, etc.

Returns: Model - The reactable model

Query Scopes​

Of Reactor​

Filter reactions by reactor:

Reaction::ofReactor($user)->get();

Parameters:

  • $reactor (Model): The reactor model

Returns: Builder - Query builder

Of Reactable​

Filter reactions by reactable:

Reaction::ofReactable($article)->get();

Parameters:

  • $reactable (Model): The reactable model

Returns: Builder - Query builder

Soft Deletes​

The model uses soft deletes:

$reaction->delete(); // Soft delete
$reaction->restore(); // Restore
$reaction->forceDelete(); // Permanent delete

Pruning​

The model supports automatic pruning of old soft-deleted reactions:

// Configure in config/reaction.php
'reaction' => [
'prune_days' => 30, // Days to keep soft-deleted reactions
],

// Run pruning
php artisan model:prune

Table Configuration​

The table name can be configured in config/reaction.php:

'tables' => [
'reaction' => 'reactions', // Default table name
],

Complete Examples​

Querying Reactions​

use JobMetric\Reaction\Models\Reaction;

// Get all reactions
$reactions = Reaction::all();

// Get reactions by type
$likes = Reaction::where('reaction', 'like')->get();

// Get reactions for a specific article
$article = Article::find(1);
$reactions = Reaction::ofReactable($article)->get();

// Get reactions from a specific user
$user = User::find(1);
$reactions = Reaction::ofReactor($user)->get();

// Get reactions with reactor and reactable
$reactions = Reaction::with(['reactor', 'reactable'])->get();

Working with Soft Deletes​

$reaction = Reaction::find(1);

// Soft delete
$reaction->delete();

// Restore
$reaction->restore();

// Check if trashed
if ($reaction->trashed()) {
// Reaction is soft-deleted
}

// Get only trashed
$trashed = Reaction::onlyTrashed()->get();

// Get with trashed
$all = Reaction::withTrashed()->get();

When to Use Reaction Model​

Use the Reaction model directly when you need to:

  • Direct Queries: Query reactions directly without going through relationships
  • Bulk Operations: Perform bulk operations on reactions
  • Analytics: Analyze reaction data across the application
  • Custom Logic: Implement custom reaction-related logic
  • Reporting: Generate reports on reaction activity