30分钟搞定Laravel数据库操作:从迁移到查询的实战指南

30分钟搞定Laravel数据库操作:从迁移到查询的实战指南

【免费下载链接】laravel Laravel 是一个具有表现力和优雅语法的 web 应用程序框架。我们已经为您下一个重大创意奠定了基础,让您无需在琐碎细节上花费过多精力,可以专注于创造性的开发工作。 【免费下载链接】laravel 项目地址: https://gitcode.com/GitHub_Trending/la/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();

迁移工作流最佳实践

团队协作建议

  1. 每次修改数据库结构都创建新迁移,不要直接修改已提交的迁移文件
  2. 在迁移中使用事务确保多表操作的原子性:
    DB::transaction(function () {
        // 执行多个相关迁移操作
    });
    
  3. 编写幂等迁移,确保多次运行不会出错:
    // 安全的添加字段方式
    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

【免费下载链接】laravel Laravel 是一个具有表现力和优雅语法的 web 应用程序框架。我们已经为您下一个重大创意奠定了基础,让您无需在琐碎细节上花费过多精力,可以专注于创造性的开发工作。 【免费下载链接】laravel 项目地址: https://gitcode.com/GitHub_Trending/la/laravel

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值