laravel/database
Bring Laravel’s database layer to non-Laravel projects: Illuminate Database with migrations, seeders, and Artisan CLI support. Includes Eloquent ORM, query builder, schema tools, and commands like migrate, db:seed, and make:* for MySQL/Postgres/SQL Server/SQLite.
Installation
composer require luracast/database
Requires PHP 7.4+ and a database connection configured in config/database.php (manually or via .env).
First Database Connection
Define a connection in config/database.php:
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
],
],
Run Migrations
vendor/bin/artisan migrate
(Ensure migrations table exists; run migrate:install if missing.)
First Migration
vendor/bin/artisan make:migration create_users_table
Edit the generated file in database/migrations/ and run:
vendor/bin/artisan migrate
Use db commands to interact with the database directly:
# Start a Tinker-like session
vendor/bin/artisan db
# Seed the database
vendor/bin/artisan db:seed
# Wipe and reset (careful!)
vendor/bin/artisan db:wipe
vendor/bin/artisan migrate:fresh
Structured Migration Naming
Use timestamps + descriptive names (e.g., 2023_01_01_000000_create_products_table).
Group related migrations (e.g., users_, roles_) for logical rollbacks.
Seeding Data
Create seeders with make:seeder:
vendor/bin/artisan make:seeder UsersTableSeeder
Chain seeders in database/seeders/DatabaseSeeder.php:
public function run()
{
$this->call([
UsersTableSeeder::class,
RolesTableSeeder::class,
]);
}
Run with:
vendor/bin/artisan db:seed --class=UsersTableSeeder
Artisan Command Integration Extend Laravel’s Artisan for custom tasks. Example:
vendor/bin/artisan make:command GenerateReports
Register in app/Console/Kernel.php:
protected $commands = [
\App\Console\Commands\GenerateReports::class,
];
Non-Laravel Projects
Luracast\Database\Bootstrap\BootstrapApplication to bootstrap the database layer:
$app = BootstrapApplication::create();
$app->make(\Illuminate\Database\Capsule\Manager::class)->bootEloquent();
$users = \App\Models\User::all();
Testing
Use migrate:fresh in PHPUnit tests:
public function setUp(): void
{
Artisan::call('migrate:fresh');
Artisan::call('db:seed');
}
Custom Commands
Override default commands (e.g., db:wipe) by publishing and modifying:
vendor/bin/artisan vendor:publish --tag=laravel-database-commands
Missing migrations Table
Table 'migrations' doesn't exist.migrate:install before migrations.AppServiceProvider:
public function boot()
{
if (!Schema::hasTable('migrations')) {
Artisan::call('migrate:install');
}
}
Environment Configuration
.env is not auto-loaded. Manually set up config/database.php or use:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
env() helper or config('database.connections.mysql.host').Seeding Order Dependencies
Artisan::call('migrate') in seeders or chain them logically.Artisan in Non-Laravel Contexts
serve or tinker require a full Laravel setup.migrate, db:seed, and make:* commands for non-Laravel projects.Migration Failures
migrate:status for stuck migrations.migrate:rollback --step=1 or migrate:reset.--pretend to dry-run migrations:
vendor/bin/artisan migrate --pretend
Seeder Errors
vendor/bin/artisan db:seed --class=UsersTableSeeder --force
DB::transaction(function () {
// Seeding logic
});
Eloquent Issues
app/Models/ (or configured in Model::setConnectionResolvers()).bootEloquent() is called:
$capsule = new \Illuminate\Database\Capsule\Manager();
$capsule->addConnection(config('database.default'));
$capsule->bootEloquent();
Custom Migration Paths
Override the migrations path in config/database.php:
'migrations' => [
'path' => database_path('custom_migrations'),
],
Event Listeners
Listen to migration events (e.g., Migrating, Migrated) in EventServiceProvider:
protected $listen = [
'Illuminate\Database\Events\Migrating' => [
\App\Listeners\LogMigration::class,
],
];
Database Observers Attach observers to models for automatic logging/auditing:
class UserObserver
{
public function saved(User $user)
{
// Log changes
}
}
Register in AppServiceProvider:
User::observe(UserObserver::class);
Query Logging
Enable query logging in config/database.php:
'log' => env('DB_LOG_QUERIES', false),
'log_query_params' => env('DB_LOG_QUERY_PARAMS', true),
View logs in storage/logs/laravel.log.
How can I help you explore Laravel packages today?