Laravel uses database structure migrations to efficiently handle changes to your database schema in a version-controlled environment. Migrations are defined as PHP classes, and Laravel’s migration system executes them to uniformly modify your database schema across many environments, including development, staging, and production.
Important steps for configuring your environment and using migrations in Laravel:
1. Environment Configuration (.env file)
First, use the.env file to configure your environment’s database connection. Update the following keys based on your database configuration:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password
If you have numerous environments (e.g., development and production), you can use separate.env files or configure various environment variables on each server.
2. Creating Migrations
Now generate a new migration file by using the Artisan command:
php artisan make:migration create_users_table
This will generate a migration file in the database/migrations directory with a timestamp in the filename, ensuring that migrations are properly ordered. The file will have a class with up() and down() methods.
- The up() method defines the modifications to be made (for example, establishing a table or adding columns).
- The down() method specifies how to reverse the modifications (for example, lowering the table or removing columns).
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
3. Running Migrations
To run all outstanding migrations (that have not yet been run), run the following Artisan command:
php artisan migrate
Laravel will utilize the connection information in your.env file to connect to the given database and perform the migration.
4. Rolling Back Migrations
To undo the latest set of migrations, run the following command:
php artisan migrate:rollback
You can also specify how many batches to roll back by using the –step option:
php artisan migrate:rollback --step=1
To roll back and rerun all migrations:
php artisan migrate:refresh
To reset all migrations, drop all tables, and run them again:
php artisan migrate:reset
php artisan migrate
5. Seeding Data
Seeders are useful for populating the database with test data. You can create a seeder with the Artisan command:
php artisan make:seeder UsersTableSeeder
Once established, you can specify how to seed data using the run() method. For example, seeding the users’ table:
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class UsersTableSeeder extends Seeder
{
public function run()
{
DB::table('users')->insert([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => Hash::make('password'),
]);
}
}
You can run all seeders using:
php artisan db:seed
Or, run a specific seeder:
php artisan db:seed --class=UsersTableSeeder
6.Configuring Migrations for Different Environments
In a multi-environment arrangement (local, production, etc.), you may choose to configure separate database connections for each environment. The Laravel configuration system allows you to configure this in the config/database.php file.
For example, you could have a MySQL connection for development and a PostgreSQL connection for production. Your .env files would vary by environment:
.env (Development)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dev_db
DB_USERNAME=root
DB_PASSWORD=root_password
.env.production (Production)
DB_CONNECTION=pgsql
DB_HOST=prod-db.example.com
DB_PORT=5432
DB_DATABASE=prod_db
DB_USERNAME=prod_user
DB_PASSWORD=prod_password
By following these instructions, you can ensure that Laravel manages your database schema consistently across several settings.