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

添加订单时触发SQLSTATE[23000]完整性约束违反错误排查

创建订单时name字段不能为空错误排查与解决

报错内容:Illuminate\Database\QueryException SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
触发场景:访问产品详情页并尝试创建订单时,向commande表插入数据时name字段为null,违反数据库非空约束。
业务背景:产品归属不同用户(products表含user_id外键),订单需关联用户审核。

错误原因

  • 页面加载时直接执行订单保存逻辑:当前getProduct控制器方法在用户访问产品详情页(GET请求)时,就实例化AppCommande并执行save(),此时表单还未提交,$request->input('name')等字段均为null,导致插入数据库时违反非空约束。
  • 表单提交路由与处理逻辑不匹配:视图中表单的action指向admin.commandes.store,但当前路由绑定的getProduct方法却在处理保存操作,逻辑完全错位。
  • 视图存在字段绑定错误:比如ville字段的value绑定成了$commande->familyname,familyname字段的错误判断引用了$errors->has('name'),这些问题会导致表单数据异常。

解决方法

1. 拆分控制器逻辑

修改CommandeUserController,将展示页面和保存订单的逻辑分开:

// 仅负责展示产品和订单表单
public function getProduct($id)
{
    $product = Product::findOrFail($id);
    return view('product', compact('product'));
}

// 处理表单提交,保存订单
public function store(Request $request)
{
    // 表单验证,拦截空值并给出提示
    $request->validate([
        'name' => 'required|string|max:255',
        'familyname' => 'required|string|max:255',
        'quantity' => 'required|integer|min:1',
        'mobile' => 'required|string',
        'ville' => 'required|string|max:255',
        'adresse' => 'required|string',
        'id_product' => 'required|exists:products,id',
        'user_id' => 'required|exists:users,id',
    ]);

    $commande = new AppCommande;
    $commande->name = $request->input('name');
    $commande->familyname = $request->input('familyname');
    $commande->quantity = $request->input('quantity');
    $commande->mobile = $request->input('mobile');
    $commande->ville = $request->input('ville');
    $commande->adresse = $request->input('adresse');
    $commande->id_product = $request->input('id_product');
    $commande->user_id = $request->input('user_id');
    $commande->save();

    // 保存成功后跳转并提示
    return redirect()->route('product.single', ['id' => $request->id_product])->with('success', '订单创建成功');
}

2. 修正路由配置

添加POST路由处理表单提交,确保GET路由仅负责展示:

// 展示产品详情和订单表单
Route::get('/product/{id}', [ 'uses' => 'CommandeUserController@getProduct', 'as' => 'product.single' ]);
// 处理订单提交
Route::post('/commande/store', [ 'uses' => 'CommandeUserController@store', 'as' => 'admin.commandes.store' ]);

3. 修复视图中的错误

修正字段绑定和错误提示的问题:

@extends('layouts.app')
@section('content')
    <div class="col-sm-6 col-md-4">
        <div class="thumbnail">
            <img src="{{ asset('uploads/product/'.$product->image) }}" width="90px" alt="image">
            <div class="caption">
                <h3> {{$product->name}} </h3>
                <p class="discription"> {{$product->description}} </p>
                <div class="clearfix">
                    <div class="pull-left price">$ {{$product->price}}</div>
                </div>
            </div>
        </div>
    </div>
    <div class="card">
        <div class="card-header">
            Create Commande
        </div>
        <div class="card-body">
            <form action="{{ route("admin.commandes.store") }}" method="POST" enctype="multipart/form-data">
                @csrf
                <div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}">
                    <label for="name">Name</label>
                    <input type="text" id="name" name="name" class="form-control" value="{{ old('name') }}">
                    @if($errors->has('name'))
                        <em class="invalid-feedback">
                            {{ $errors->first('name') }}
                        </em>
                    @endif
                    <p class="helper-block">
                        {{ trans('global.product.fields.name_helper') }}
                    </p>
                </div>
                <div class="form-group {{ $errors->has('familyname') ? 'has-error' : '' }}">
                    <label for="familyname">Family Name</label>
                    <input type="text" id="familyname" name="familyname" class="form-control" value="{{ old('familyname') }}">
                    @if($errors->has('familyname'))
                        <em class="invalid-feedback">
                            {{ $errors->first('familyname') }}
                        </em>
                    @endif
                    <p class="helper-block">
                        {{ trans('global.product.fields.name_helper') }}
                    </p>
                </div>
                <div class="form-group {{ $errors->has('mobile') ? 'has-error' : '' }}">
                    <label for="mobile">Mobile</label>
                    <input type="number" id="mobile" name="mobile" class="form-control" value="{{ old('mobile') }}" step="1">
                    @if($errors->has('mobile'))
                        <em class="invalid-feedback">
                            {{ $errors->first('mobile') }}
                        </em>
                    @endif
                    <p class="helper-block">
                        {{ trans('global.product.fields.price_helper') }}
                    </p>
                </div>
                <div class="form-group {{ $errors->has('quantity') ? 'has-error' : '' }}">
                    <label for="quantity">Quantity</label>
                    <input type="number" id="quantity" name="quantity" class="form-control" value="{{ old('quantity') }}" step="1">
                    @if($errors->has('quantity'))
                        <em class="invalid-feedback">
                            {{ $errors->first('quantity') }}
                        </em>
                    @endif
                    <p class="helper-block">
                        {{ trans('global.product.fields.price_helper') }}
                    </p>
                </div>
                <div class="form-group {{ $errors->has('ville') ? 'has-error' : '' }}">
                    <label for="ville">City</label>
                    <input type="text" id="ville" name="ville" class="form-control" value="{{ old('ville') }}">
                    @if($errors->has('ville'))
                        <em class="invalid-feedback">
                            {{ $errors->first('ville') }}
                        </em>
                    @endif
                    <p class="helper-block">
                        {{ trans('global.product.fields.name_helper') }}
                    </p>
                </div>
                <div class="form-group {{ $errors->has('adresse') ? 'has-error' : '' }}">
                    <label for="adresse">Adresse</label>
                    <input type="text" id="adresse" name="adresse" class="form-control" value="{{ old('adresse') }}">
                    @if($errors->has('adresse'))
                        <em class="invalid-feedback">
                            {{ $errors->first('adresse') }}
                        </em>
                    @endif
                    <p class="helper-block">
                        {{ trans('global.product.fields.name_helper') }}
                    </p>
                </div>
                <input type="hidden" name="id_product" value="{{ $product->id }}" />
                <input type="hidden" name="user_id" value="{{ $product->user_id }}" />
                <input class="btn btn-danger" type="submit" value="{{ trans('global.save') }}">
            </form>
        </div>
    </div>
@endsection

主要修复点:

  • 修正familyname字段的错误判断逻辑
  • 修正ville字段的value绑定值
  • 修正quantity字段的错误提示判断
  • 移除隐藏字段值中的多余空格

4. 补充优化点

  • 使用findOrFail替代find,产品不存在时直接抛出404错误,避免无效逻辑执行
  • 表单验证提前拦截非法数据,同时给用户明确的错误提示
  • 保存成功后添加重定向和提示信息,提升用户交互体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20