1. Go to this page and download the library: Download aaronfrancis/eventable library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
aaronfrancis / eventable example snippets
// Add the trait to your User model
class User extends Model
{
use HasEvents;
}
// Record events
$user->addEvent(UserEvent::LoggedIn);
$user->addEvent(UserEvent::SubscriptionStarted, ['plan' => 'pro']);
// Query by events
User::whereEventHasntHappened(UserEvent::EmailVerified)->get(); // Unverified users
User::whereLatestEventIs(UserEvent::Churned)->get(); // Churned users
User::whereEventHasHappenedAtLeast(UserEvent::Purchase, 5)->get(); // VIP customers
use AaronFrancis\Eventable\Concerns\HasEvents;
class User extends Model
{
use HasEvents;
}
enum UserEvent: int
{
case LoggedIn = 1;
case EmailVerified = 2;
case SubscriptionStarted = 3;
case Churned = 4;
case Purchase = 5;
case PageViewed = 6;
case PasswordResetRequested = 7;
}
// Check if an event exists
$user->hasEvent(UserEvent::EmailVerified); // true or false
// Get the most recent event
$user->latestEvent(); // or filter by type
$user->latestEvent(UserEvent::Purchase);
// Get the first event
$user->firstEvent(UserEvent::LoggedIn);
// Count events
$user->eventCount(); // all events
$user->eventCount(UserEvent::LoggedIn); // by type
// Get all events for a model
$user->events;
// Filter by the enum alias and backing value
$user->events()->ofType(UserEvent::LoggedIn)->get();
// Filter by raw backing values when you also provide the enum alias
$user->events()->ofTypeClass('user')->ofType([1, 5])->get();
// Filter by data
$user->events()->whereData(['order_id' => 123])->get();
$user->events()->whereData(false)->get();
// Time-based queries
$user->events()->happenedAfter(now()->subDays(7))->get();
$user->events()->happenedBefore(now()->subMonth())->get();
$user->events()->happenedInTheLast(7, Unit::Day)->get();
$user->events()->happenedInTheLast(3, Unit::Hour)->get();
$user->events()->happenedToday()->get();
$user->events()->happenedThisWeek()->get();
$user->events()->happenedThisMonth()->get();
// With explicit timezone (defaults to app timezone)
$user->events()->happenedToday('America/Chicago')->get();
// Users who made a purchase over $100 in the last 7 days
User::whereHas('events', function ($query) {
$query->ofType(UserEvent::Purchase)
->where('data->total', '>', 100)
->happenedAfter(now()->subDays(7));
})->get();
// Users who logged in today
User::whereHas('events', function ($query) {
$query->ofType(UserEvent::LoggedIn)->happenedToday();
})->get();
// Users who viewed a specific page
User::whereHas('events', function ($query) {
$query->ofType(UserEvent::PageViewed)
->whereData(['page' => '/pricing']);
})->get();
// Find users who have logged in
User::whereEventHasHappened(UserEvent::LoggedIn)->get();
// Find users who haven't verified their email
User::whereEventHasntHappened(UserEvent::EmailVerified)->get();
// With specific data
User::whereEventHasHappened(UserEvent::Purchase, ['total' => 99.99])->get();
// With advanced Laravel query constraints on the matching events
User::whereEventHasHappened(UserEvent::Purchase, function ($events) {
$events->where('data->total', '>', 99);
})->get();
// Count-based queries
User::whereEventHasHappenedTimes(UserEvent::LoggedIn, 3)->get(); // exactly 3 times
User::whereEventHasHappenedAtLeast(UserEvent::Purchase, 5)->get(); // at least 5 times
// Find by latest event
User::whereLatestEventIs(UserEvent::SubscriptionStarted)->get();
use AaronFrancis\Eventable\Contracts\PruneableEvent;
use AaronFrancis\Eventable\Prune;
use AaronFrancis\Eventable\PruneConfig;
enum UserEvent: int implements PruneableEvent
{
case LoggedIn = 1;
case EmailVerified = 2;
// ... other cases ...
case PageViewed = 6;
public function prune(): PruneConfig|Prune|null
{
return match ($this) {
// Keep only the last 5 login events per user
self::LoggedIn => Prune::keep(5),
// Delete page views older than 30 days
self::PageViewed => Prune::before(now()->subDays(30)),
default => null, // Don't prune
};
}
}
Schedule::command('eventable:prune')->daily();
namespace App\Models;
use AaronFrancis\Eventable\Models\Event as BaseEvent;
class Event extends BaseEvent
{
// Your customizations
}