laracraft-tech/laravel-useful-traits
Laravel package with handy daily-use additions: traits for PHP 8.1+ enums (get names/values/array) and Eloquent query scopes (e.g., select all columns except specific ones, date-based scopes), plus an Artisan db:truncate command.
Install via Composer:
composer require laracraft-tech/laravel-useful-traits
First Use Case: Enums
For PHP 8.1+ projects, immediately leverage UsefulEnums to convert enums to arrays:
enum Status: string {
use \LaracraftTech\LaravelUsefulAdditions\Traits\UsefulEnums;
case Active = 'active';
case Pending = 'pending';
}
// Usage:
Status::names(); // ['Active', 'Pending']
Status::array(); // ['Active' => 'active', 'Pending' => 'pending']
First Use Case: Query Scopes
Add UsefulScopes to a model for reusable time-based queries:
use LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes;
class Order extends Model {
use UsefulScopes;
}
// Usage:
Order::fromToday()->get(); // Orders created today
Order::fromYesterday()->get(); // Orders created yesterday
First Use Case: Database Truncation Reset development databases with:
php artisan db:truncate --force
UserRole, OrderStatus).Status::array() to populate migration tables:
Schema::create('statuses', function (Blueprint $table) {
$table->string('name')->unique();
$table->string('value');
});
DB::table('statuses')->insert(array_values(Status::array()));
use App\Enums\Status;
public function rules() {
return [
'status' => ['required', Rule::in(Status::values())],
];
}
UsefulScopes to base models for global reuse:
class BaseModel extends Model {
use UsefulScopes;
}
selectAllBut() for API responses:
// Exclude sensitive fields from API
User::selectAllBut(['password', 'api_token'])->get();
Order::where('user_id', auth()->id())
->fromToday()
->orderBy('created_at', 'desc')
->get();
db:truncate in .github/workflows/:
- name: Reset DB
run: php artisan db:truncate --force
~/.bashrc:
alias dbreset='php artisan db:truncate --force'
php artisan db:truncate --tables=orders,users
RefreshDatabase with UsefulScopes for targeted queries:
use LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes;
it('filters recent orders', function () {
Order::factory()->create(['created_at' => now()->yesterday()]);
expect(Order::fromToday()->count())->toBe(0);
});
db:truncate vs. migrate:fresh in benchmarks.array_map(fn($e) => $e->value, Status::cases()) as a fallback for older versions.collect(Status::cases())->pluck('value').Status::array() caches results internally; avoid calling it in loops.php artisan cache:clear
Or manually:
\LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes::clearCache();
selectAllBut() queries all columns first, then filters. For large tables, explicitly list columns:
User::select(['id', 'name', 'email'])->selectAllBut(['password']);
fromToday()/fromYesterday() use the system timezone. Override with:
Order::fromToday()->where('created_at', '>=', now()->setTimezone('UTC')->startOfDay());
php artisan db:truncate --disable-foreign-keys
migrations):
php artisan db:truncate --exclude=migrations,failed_jobs
--no-transaction.php -r "echo PHP_VERSION;"
\LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes::getCachedColumns('users');
UsefulScopes in a base model:
trait CustomScopes {
public function scopeActiveOnly($query) {
return $query->where('is_active', true);
}
}
enum Status {
use UsefulEnums;
public static function getActive(): array {
return [self::Active];
}
}
db:truncate logic by publishing the config:
php artisan vendor:publish --tag="useful-additions-config"
Then extend the TruncateCommand class in config/useful-additions.php.Status::array() in a service provider if used frequently:
public function boot() {
Status::setCacheDriver('array');
}
selectAllBut(), pre-fetch columns in a service:
$columns = \LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes::getCachedColumns('users');
How can I help you explore Laravel packages today?