sebastiaanluca/laravel-boolean-dates
Installation:
composer require sebastiaanluca/laravel-boolean-dates
Publish the config (optional, but recommended for customization):
php artisan vendor:publish --provider="SebastiaanLuca\BooleanDates\BooleanDatesServiceProvider"
Model Configuration:
Add the BooleanDates trait to your Eloquent model:
use SebastiaanLuca\BooleanDates\BooleanDates;
class User extends Model
{
use BooleanDates;
protected $booleanDates = [
'has_accepted_terms' => 'accepted_terms_at',
'is_subscribed_to_newsletter' => 'subscribed_at',
];
First Use Case:
After saving a model with a boolean field (has_accepted_terms = true), access the dynamic date property:
$user = User::create(['has_accepted_terms' => true]);
$user->accepted_terms_at; // Returns Carbon instance
Form Handling:
$user->update(['has_accepted_terms' => $request->has('terms')]);
accepted_terms_at).Dynamic Property Access:
if ($user->accepted_terms_at) {
echo "Accepted on: " . $user->accepted_terms_at->format('Y-m-d');
}
Mass Assignment:
$fillable to avoid conflicts:
protected $fillable = ['has_accepted_terms', /* ... */];
API Responses:
return UserResource::make($user)->additional([
'accepted_terms_at' => $user->accepted_terms_at,
]);
Validation: Use Laravel’s validation rules to ensure boolean fields are validated before conversion:
$request->validate(['terms' => 'accepted']);
Database Schema: Add the corresponding date columns to your migration:
$table->boolean('has_accepted_terms')->default(false);
$table->timestamp('accepted_terms_at')->nullable();
Query Scopes: Filter models by date ranges:
public function scopeAcceptedAfter($query, $date)
{
return $query->where('accepted_terms_at', '>=', $date);
}
Events/Observers: Trigger logic when boolean fields change (e.g., send emails on acceptance):
public function updatedHasAcceptedTerms(User $user)
{
if ($user->wasChanged('has_accepted_terms') && $user->has_accepted_terms) {
Mail::to($user)->send(new TermsAccepted($user));
}
}
Circular References:
$fillable or $guarded; it’s auto-generated and shouldn’t be manually managed.Null Handling:
null, the dynamic date property will also be null. Ensure your logic handles this edge case:
$user->accepted_terms_at ?? 'Never accepted';
Timestamp Precision:
Carbon for date handling. If your database uses a different timezone, ensure consistency in your config/app.php:
'timezone' => 'UTC',
Model Caching:
fresh() or refresh() to reload data:
$user->fresh()->accepted_terms_at;
Check Config:
Verify the $booleanDates array in your model maps correctly to database columns:
protected $booleanDates = [
'has_accepted_terms' => 'accepted_terms_at', // Must match DB column
];
Log Conversions: Enable debug logging to trace conversions:
\Log::debug('Boolean to date conversion:', [
'boolean' => $user->has_accepted_terms,
'date' => $user->accepted_terms_at,
]);
Custom Date Formatting:
Override the default Carbon instance by extending the trait:
use SebastiaanLuca\BooleanDates\BooleanDates as BaseBooleanDates;
class User extends Model
{
use BaseBooleanDates;
public function getAcceptedTermsAtAttribute()
{
return $this->booleanDatesGet('has_accepted_terms')
? Carbon::now()->startOfDay()
: null;
}
Batch Processing:
Use the package’s BooleanDates facade for bulk operations (if added in future updates):
\SebastiaanLuca\BooleanDates\Facades\BooleanDates::convert($model);
Soft Deletes: Ensure soft-deleted models don’t interfere with date conversions by excluding them from queries or handling them in observers:
if ($user->trashed()) {
$user->accepted_terms_at = null;
}
Testing: Mock dynamic properties in tests:
$user = User::factory()->create(['has_accepted_terms' => true]);
$this->assertInstanceOf(Carbon::class, $user->accepted_terms_at);
How can I help you explore Laravel packages today?