30分钟搞定Laravel数据库操作:从迁移到查询的实战指南
你还在为数据库表结构变更手动编写SQL吗?还在担心团队协作时数据库版本不一致?本文将带你掌握Laravel框架的数据库迁移(Migration)与查询构建器(Query Builder)核心技能,让你30分钟内从"数据库小白"变身"Laravel数据操作高手"。读完本文你将学会:创建版本化迁移文件、设计关联表结构、执行复杂查询、回滚与重置数据库等实用技能。
Laravel数据库配置基础
Laravel的数据库配置集中在config/database.php文件中,支持多种数据库驱动(MySQL、PostgreSQL、SQLite等)。默认配置使用SQLite数据库,你可以通过修改该文件或环境变量.env来切换数据库连接:
// config/database.php 中的默认数据库连接配置
'default' => env('DB_CONNECTION', 'sqlite'),
// 多种数据库连接配置示例
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
],
// 其他数据库配置...
]
建议在开发环境中使用.env文件而非直接修改config/database.php,环境变量配置更便于不同环境间的切换:
# .env 文件示例
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=secret
数据库迁移完全指南
迁移文件结构解析
迁移(Migration)是Laravel实现数据库版本控制的核心功能,所有迁移文件存储在database/migrations/目录下。以默认的用户表迁移文件database/migrations/0001_01_01_000000_create_users_table.php为例,其基本结构如下:
return new class extends Migration
{
// 运行迁移:创建表结构
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id(); // 自增ID主键
$table->string('name'); // 字符串字段
$table->string('email')->unique(); // 唯一邮箱字段
$table->timestamp('email_verified_at')->nullable(); // 可空时间戳
$table->string('password'); // 密码字段
$table->rememberToken(); // 记住我令牌
$table->timestamps(); // 创建/更新时间戳
});
// 同时创建了密码重置表和会话表
Schema::create('password_reset_tokens', function (Blueprint $table) {
// 表结构定义...
});
Schema::create('sessions', function (Blueprint $table) {
// 表结构定义...
});
}
// 回滚迁移:删除表
public function down(): void
{
Schema::dropIfExists('users');
Schema::dropIfExists('password_reset_tokens');
Schema::dropIfExists('sessions');
}
};
创建与运行迁移
使用Artisan命令创建新的迁移文件:
# 创建users表迁移
php artisan make:migration create_users_table
# 创建posts表迁移,包含标题、内容、用户ID字段
php artisan make:migration create_posts_table --create=posts
运行迁移将执行所有未运行的迁移文件:
# 运行所有未执行的迁移
php artisan migrate
# 查看迁移状态
php artisan migrate:status
迁移执行后,Laravel会在数据库中创建migrations表记录已执行的迁移文件,确保不会重复执行。
迁移回滚与重置
当需要撤销迁移时,可使用回滚命令:
# 回滚最后一次迁移操作
php artisan migrate:rollback
# 回滚所有迁移(谨慎使用!会删除所有表)
php artisan migrate:reset
# 回滚所有迁移并重新运行(开发环境常用)
php artisan migrate:refresh
表结构设计与字段类型
常用字段类型示例
Laravel迁移提供了丰富的字段类型方法,以下是常用类型示例:
Schema::create('products', function (Blueprint $table) {
$table->id(); // 自增ID (bigint)
$table->string('name', 100); // 带长度的字符串 (varchar)
$table->text('description'); // 长文本 (text)
$table->decimal('price', 8, 2); // decimal(8,2) 价格字段
$table->integer('stock')->default(0); // 整数,默认0
$table->boolean('is_active')->default(true); // 布尔值
$table->enum('status', ['draft', 'published', 'archived']); // 枚举类型
$table->foreignId('category_id')->constrained(); // 外键关联
$table->timestamps(); // created_at 和 updated_at
$table->softDeletes(); // 软删除支持 (deleted_at)
});
索引与约束
为提高查询性能,可通过迁移添加索引:
Schema::create('users', function (Blueprint $table) {
// 唯一索引
$table->string('email')->unique();
// 普通索引
$table->index('name');
// 复合索引
$table->index(['category_id', 'created_at']);
// 外键约束
$table->foreignId('role_id')
->constrained('roles')
->onUpdate('cascade')
->onDelete('restrict');
});
查询构建器使用技巧
基本CRUD操作
Laravel的查询构建器提供了流畅的API,让你无需编写原始SQL即可执行数据库操作:
// 创建记录 (Create)
$user = DB::table('users')->insert([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password'),
]);
// 读取记录 (Read)
$users = DB::table('users')
->where('active', true)
->orderBy('name', 'asc')
->take(10)
->get();
// 更新记录 (Update)
DB::table('users')
->where('id', 1)
->update(['name' => 'Jane Doe']);
// 删除记录 (Delete)
DB::table('users')->where('id', 1)->delete();
高级查询技巧
条件查询与连接
// 复杂条件查询
$posts = DB::table('posts')
->where('status', 'published')
->whereBetween('created_at', [now()->subMonth(), now()])
->orWhere(function ($query) {
$query->where('views', '>', 1000)
->where('comments', '>', 10);
})
->get();
// 表连接查询
$comments = DB::table('comments')
->join('users', 'comments.user_id', '=', 'users.id')
->select('comments.*', 'users.name as user_name')
->get();
聚合查询
// 统计查询
$stats = [
'total_users' => DB::table('users')->count(),
'active_users' => DB::table('users')->where('last_login', '>', now()->subMonth())->count(),
'avg_posts_per_user' => DB::table('posts')->avg('user_id'),
'max_price' => DB::table('products')->max('price'),
];
模型与数据库交互
虽然本文重点介绍迁移和查询构建器,值得一提的是Laravel的Eloquent ORM可进一步简化数据库操作。通过创建对应表的模型类(如app/Models/User.php),你可以使用更直观的面向对象语法操作数据:
// User模型示例 (app/Models/User.php)
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 关联定义示例
public function posts()
{
return $this->hasMany(Post::class);
}
}
// 使用模型查询
$user = User::find(1);
$posts = $user->posts()->where('status', 'published')->get();
迁移工作流最佳实践
团队协作建议
- 每次修改数据库结构都创建新迁移,不要直接修改已提交的迁移文件
- 在迁移中使用事务确保多表操作的原子性:
DB::transaction(function () { // 执行多个相关迁移操作 }); - 编写幂等迁移,确保多次运行不会出错:
// 安全的添加字段方式 if (!Schema::hasColumn('users', 'phone')) { Schema::table('users', function (Blueprint $table) { $table->string('phone')->nullable(); }); }
迁移文件命名规范
遵循清晰的命名约定,让其他开发者一目了然:
# 格式:动作_表名_操作内容
2023_10_01_000000_create_users_table.php
2023_10_02_000000_add_email_verified_at_to_users_table.php
2023_10_03_000000_create_posts_table.php
总结与进阶学习
通过本文你已经掌握了Laravel数据库操作的核心技能:从配置数据库连接、创建版本化迁移文件、设计表结构,到使用查询构建器执行复杂查询。这些技能足以应对大多数Web应用的数据库需求。
进阶学习建议:
- 深入学习Eloquent ORM关系模型(一对一、一对多、多对多)
- 掌握数据库事务与锁机制
- 学习数据填充(Seeder)和模型工厂(Factory)
- 探索数据库事件和观察者模式
记住,优秀的数据库设计是高性能应用的基础。合理使用Laravel的迁移和查询构建器,将让你的项目数据库结构清晰、版本可控、查询高效。现在就打开你的终端,尝试创建第一个迁移文件吧!
# 开始你的第一个迁移实践
php artisan make:migration create_products_table
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



