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.
composer require laracraft-tech/laravel-useful-additions
php artisan vendor:publish --tag="useful-additions-config"
For PHP 8.1+ projects, leverage UsefulEnums to simplify enum handling:
use LaracraftTech\LaravelUsefulAdditions\Traits\UsefulEnums;
enum Status: string {
use UsefulEnums;
case Active = 'active';
case Inactive = 'inactive';
}
// Usage:
Status::names(); // ['Active', 'Inactive']
Status::values(); // ['active', 'inactive']
Status::array(); // ['Active' => 'active', 'Inactive' => 'inactive']
Apply UsefulScopes to Eloquent models for reusable query patterns:
use LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes;
class Post extends Model {
use UsefulScopes;
}
// Exclude columns dynamically:
Post::selectAllBut(['deleted_at'])->get();
// Filter by date ranges:
Post::fromToday()->get(); // Created today
Post::fromYesterday()->get(); // Created yesterday
Reset your database quickly during development:
# Truncate all tables
php artisan db:truncate
# Truncate specific tables (e.g., 'users', 'posts')
php artisan db:truncate --tables=users,posts
# Disable foreign key checks (safer for complex schemas)
php artisan db:truncate --no-foreign
Status::values() to define enum columns:
Schema::create('posts', function (Blueprint $table) {
$table->string('status')->default(Status::Active->value);
});
$validator->rule('status', Rule::in(Status::array()));
$statusLabels = collect(Status::array())->flip();
selectAllBut() to exclude sensitive columns (e.g., password, api_token) in API responses:
User::selectAllBut(['password', 'api_token'])->get();
Post::fromToday()->where('author_id', 1)->get();
UsefulScopes to add project-specific scopes:
trait CustomScopes {
public function scopePublished($query) {
return $query->where('published_at', '<=', now());
}
}
db:truncate to reset the database between feature branches:
php artisan db:truncate --force
db:truncate into deployment scripts to ensure a clean state:
php artisan db:truncate --tables=migrations,users --no-interaction
RefreshDatabaseFast (deprecated) with Laravel’s built-in RefreshDatabase or use db:truncate for faster test resets:
// In Pest/PHPUnit tests:
uses(RefreshDatabase::class);
selectAllBut() to sanitize model outputs:
public function index() {
return User::selectAllBut(['password', 'remember_token'])->get();
}
fromToday/fromYesterday for activity dashboards:
$todayLogs = Log::fromToday()->get();
$yesterdayLogs = Log::fromYesterday()->get();
Status::array() for consistency:
factory(Post::class)->createMany([
'status' => array_rand(Status::array(), 10)
]);
UsefulEnums.Status::array() creates a new array on each call. Cache the result if used frequently:
private static ?array $statusArray = null;
public static function array(): array {
return self::$statusArray ??= array_combine(self::names(), self::values());
}
selectAllBut() caches table columns. Clear the cache after migrations:
php artisan cache:clear
Or manually trigger a refresh:
\LaracraftTech\LaravelUsefulAdditions\Traits\UsefulScopes::clearColumnCache('posts');
selectAllBut() uses dynamic SQL. Avoid using it with computed columns or JSON columns in MySQL < 8.0.fromToday/fromYesterday require created_at timestamps. Add a default if missing:
$table->timestamp('created_at')->useCurrent();
php artisan db:truncate --no-foreign
--no-transaction:
php artisan db:truncate --no-transaction
migrations) if needed:
php artisan db:truncate --ignore=migrations
selectAllBut() returns unexpected columns, verify the cache is updated:
php artisan cache:clear
Status::array() to overwrite keys.fromToday/fromYesterday respect the app’s timezone. Set it explicitly in config/app.php:
'timezone' => 'UTC',
RefreshDatabaseFast is deprecated. Use Laravel’s RefreshDatabase instead:
use Illuminate\Foundation\Testing\RefreshDatabase;
UsefulScopes to add project-specific methods:
trait AppScopes {
public function scopeActive($query) {
return $query->where('status', Status::Active->value);
}
}
enum Role {
use UsefulEnums;
case Admin;
case User;
public static function isAdmin($value) {
return $value === self::Admin->value;
}
}
db:truncate command logic by publishing and modifying the config:
php artisan vendor:publish --tag="useful-additions-config"
Then extend the TruncateTables command in app/Console/Commands/TruncateTables.php.db:truncate in test setups for faster resets:
beforeEach(function () {
\Artisan::call('db:truncate');
});
RefreshDatabase for hybrid approaches:
uses(RefreshDatabase::class)->beforeEach(function () {
\Artisan::call('db:truncate', ['--ignore' => 'migrations']);
});
How can I help you explore Laravel packages today?