You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel中开发用户家电偏好排名提交表单

Laravel 家电偏好排名功能实现方案

1. 数据库层准备

首先创建存储排名结果的数据表,执行命令生成迁移文件:

php artisan make:migration create_appliance_rankings_table

编辑生成的迁移文件的up方法,定义字段:

public function up()
{
    Schema::create('appliance_rankings', function (Blueprint $table) {
        $table->id();
        // 若需要关联登录用户可保留此字段,游客提交可删除
        $table->foreignId('user_id')->nullable()->constrained()->onDelete('cascade');
        $table->tinyInteger('refrigerator_rank'); // 冰箱排名
        $table->tinyInteger('microwave_rank'); // 微波炉排名
        $table->tinyInteger('stove_rank'); // 炉灶排名
        $table->timestamps();
    });
}

执行迁移生成表:

php artisan migrate

2. 创建对应模型

执行命令生成模型:

php artisan make:model ApplianceRanking

编辑模型文件,设置可批量赋值字段:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ApplianceRanking extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'refrigerator_rank',
        'microwave_rank',
        'stove_rank'
    ];
}

3. 配置路由

在routes/web.php中添加表单访问和提交路由:

use App\Http\Controllers\ApplianceRankingController;

Route::get('/appliance-rank', [ApplianceRankingController::class, 'create'])->name('rank.create');
Route::post('/appliance-rank', [ApplianceRankingController::class, 'store'])->name('rank.store');

4. 编写控制器逻辑

执行命令生成控制器:

php artisan make:controller ApplianceRankingController

编辑控制器代码:

<?php

namespace App\Http\Controllers;

use App\Models\ApplianceRanking;
use Illuminate\Http\Request;

class ApplianceRankingController extends Controller
{
    // 展示排名表单
    public function create()
    {
        return view('rank.create');
    }

    // 处理提交逻辑
    public function store(Request $request)
    {
        // 校验提交数据:三个排名都是1-3的整数,且互不重复
        $validated = $request->validate([
            'refrigerator_rank' => 'required|integer|between:1,3|distinct:microwave_rank,stove_rank',
            'microwave_rank' => 'required|integer|between:1,3',
            'stove_rank' => 'required|integer|between:1,3',
        ]);

        // 若为登录用户提交,补充用户ID
        if (auth()->check()) {
            $validated['user_id'] = auth()->id();
        }

        // 数据入库
        ApplianceRanking::create($validated);

        // 返回成功提示,可根据需求调整跳转逻辑
        return back()->with('success', '排名提交成功');
    }
}

5. 编写前端表单

创建resources/views/rank/create.blade.php视图文件,新手可以先做下拉选择版本,逻辑简单不容易出错:

<!DOCTYPE html>
<html>
<head>
    <title>家电偏好排名</title>
</head>
<body>
    @if(session('success'))
        <p style="color: green">{{ session('success') }}</p>
    @endif
    <form method="POST" action="{{ route('rank.store') }}">
        @csrf
        <p>请对以下家电按偏好程度排序,1为最喜欢,3为最不喜欢,排名不可重复</p>
        <div>
            <label>冰箱:</label>
            <select name="refrigerator_rank" required>
                <option value="">请选择排名</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
            @error('refrigerator_rank')
                <p style="color: red">{{ $message }}</p>
            @enderror
        </div>
        <div>
            <label>微波炉:</label>
            <select name="microwave_rank" required>
                <option value="">请选择排名</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
            @error('microwave_rank')
                <p style="color: red">{{ $message }}</p>
            @enderror
        </div>
        <div>
            <label>炉灶:</label>
            <select name="stove_rank" required>
                <option value="">请选择排名</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
            @error('stove_rank')
                <p style="color: red">{{ $message }}</p>
            @enderror
        </div>
        <button type="submit">提交排名</button>
    </form>
</body>
</html>

如果需要更好的用户体验,可以替换成拖拽排序功能,用原生JS的draggableAPI实现即可,排序后把对应排名值写入隐藏输入框提交,存储逻辑和上述方案完全一致。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:15:04