You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Laravel产品表迁移中创建code、size_id、color_id联合索引?

为Laravel Products表创建code、size_id、color_id索引方案

嘿,这事儿好办!我来帮你搞定products表的索引创建需求,结合你提到的业务场景——存在名称和code相同但尺寸/颜色不同的产品,咱们分两种情况来处理:

情况1:还没运行过products表的迁移

如果这个迁移文件还没执行过,你可以直接在原迁移代码里添加索引逻辑,这样表创建时索引就一起生成了:

Schema::create('products', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('code');
    $table->bigInteger('price');
    $table->string('slug');
    $table->text('description');
    $table->text('images');
    $table->string('tags');
    $table->integer('viewCount')->default(0);
    $table->integer('commentCount')->default(0);
    $table->integer('stockCount')->default(0);
    $table->integer('sailedCount')->default(0);
    $table->boolean('specialSail')->default(false);
    $table->integer('size_id')->unsigned();
    $table->foreign('size_id')->references('id')->on('sizes')->onDelete('cascade');
    $table->integer('color_id')->unsigned();
    $table->foreign('color_id')->references('id')->on('colors')->onDelete('cascade');
    
    // 👇 添加复合索引,加速多列组合查询
    $table->index(['code', 'size_id', 'color_id']);
    
    // 如果你需要**严格保证同code+尺寸+颜色的产品不重复**,就替换成下面这行(复合唯一索引)
    // $table->unique(['code', 'size_id', 'color_id']);
});

情况2:已经运行过迁移(推荐方案)

迁移文件是版本化的,不建议修改已经执行过的文件,最好创建新的迁移来添加索引:

  1. 首先生成新的迁移文件:
php artisan make:migration add_indexes_to_products_table
  1. 打开生成的迁移文件,替换成以下代码:
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
            // 添加复合索引,用于加速多列查询
            $table->index(['code', 'size_id', 'color_id']);
            
            // 若需要唯一约束(避免重复的code+size+color组合),用下面这行替换上面的index
            // $table->unique(['code', 'size_id', 'color_id']);
        });
    }

    public function down()
    {
        Schema::table('products', function (Blueprint $table) {
            // 对应删除索引(如果是唯一索引,把dropIndex改成dropUnique)
            $table->dropIndex(['code', 'size_id', 'color_id']);
        });
    }
};
  1. 执行迁移:
php artisan migrate

额外说明

  • 复合索引的优势:这个索引不仅能加速同时基于code、size_id、color_id的组合查询,还能支持前缀查询(比如只按code查询的语句也能用到这个索引),比单独给每列创建索引效率更高。
  • 自定义索引名称:如果你想给索引起个更简洁的名字,可以在第二个参数指定:
$table->index(['code', 'size_id', 'color_id'], 'prod_code_size_color_idx');

内容的提问来源于stack exchange,提问作者kabiri

火山引擎 最新活动