Php Laravel 6:完整性约束冲突:1452无法添加或更新子行:外键约束失败

Php Laravel 6:完整性约束冲突:1452无法添加或更新子行:外键约束失败,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,各位! 我需要一些帮助。我正在Laravel6中创建一个web应用程序,允许用户通过php表单插入数据,该表单也插入到数据库中 基本上,我创建了一个供应商,它在工作,我创建了一个材料,它也在工作,然后我创建了一个参考供应商和材料的采购。我还有一个单位表,说明材料是否为千克、每单位等 以下是我的模式: 供应商模式: Schema::create('suppliers', function (Blueprint $table) { $table->increments('id'

各位!

我需要一些帮助。我正在Laravel6中创建一个web应用程序,允许用户通过php表单插入数据,该表单也插入到数据库中

基本上,我创建了一个供应商,它在工作,我创建了一个材料,它也在工作,然后我创建了一个参考供应商和材料的采购。我还有一个单位表,说明材料是否为千克、每单位等

以下是我的模式:

供应商模式:

Schema::create('suppliers', function (Blueprint $table) {
        $table->increments('id');
        $table->string('reference');
        $table->string('name',255);
        $table->string('address',255);
        $table->text('zip_code')->nullable();
        $table->string('locality');
        $table->text('phone')->nullable();
        $table->text('description')->nullable();
        $table->timestamps();
    });
材质模式:

Schema::create('materials', function (Blueprint $table) {
        $table->increments('id');
        $table->string('reference');
        $table->string('name',255);
        $table->text('description')->nullable();
        $table->integer('quantity');
        $table->integer('quantity_in_use')->default(0);
        $table->string('image_material')->nullable();
        $table->string('image_receipt')->nullable();
        $table->timestamps();
    });
单元模式:

 Schema::create('units', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
    });
购买模式:

Schema::create('purchases', function (Blueprint $table) {
        $table->increments('id');
        $table->string('reference');
        $table->datetime('date');
        $table->unsignedInteger('supplier_id');
        $table->unsignedInteger('material_id');
        $table->integer('quantity');
        $table->text('description')->nullable();
        $table->double('price_per_unit');
        $table->unsignedInteger('unit_id');
        $table->timestamps();
    });
我创建了一个关系迁移:

Schema::table('purchases', function (Blueprint $table) {
        $table->foreign('supplier_id')->references('id')->on('suppliers');
        $table->foreign('material_id')->references('id')->on('materials');
        $table->foreign('unit_id')->references('id')->on('units');
    });
问题是,每当我尝试创建购买时,都会出现以下错误:

SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败GuacamaiTeste.purchases,constraint purchases\u unit\u id\u foreign key unit\u id REFERENCES units id SQL:insert in purchases reference,date,supplier\u id,material\u id,description,quantity,price\u per\u unit,update\u at,以C01,17-04-2020 00:00:00,8,5的值创建,只是购买,1,12020-04-17 04:08:00,2020-04-17 04:08:00

这是我的模型:

class Purchase extends Model{
protected $fillable = ['reference', 'date', 'supplier_id', 'material_id', 'quantity', 'description', 'price_per_unit'];

public function supplier()
{
    return $this->belongsTo('App\Supplier', 'supplier_id');
}

public function material()
{
    return $this->belongsTo('App\Material', 'material_id');
}

public function unit()
{
    return $this->belongsTo('App\Unit', 'unit_id');
}}
和我的采购管理员:

use Illuminate\Http\Request;
use App\Unit;
use App\Purchase;
use App\Supplier;
use App\Material;
use App\Http\Requests\StorePurchase;
use App\Http\Controllers\Controller;

class PurchaseController extends Controller
{
/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $purchases = Purchase::with(['unit', 'supplier', 'material'])->get();

    return view('admin.purchases.index', [
        'purchases' => $purchases,
    ]);
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    $units = Unit::all();
    $suppliers = Supplier::all();
    $materials = Material::all();

    return view('admin.purchases.create', [
        'units' => $units,
        'suppliers' => $suppliers,
        'materials' => $materials,
    ]);
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(StorePurchase $request)
{
    $validated = $request->validated();

    $validated['price'] = $validated['price_per_unit'] * $validated['quantity'];

    if (empty($validated['supplier_id'])) {
        $supplier = Supplier::create([
            'reference' => $validated['supplier_reference'],
            'name' => $validated['supplier_name'],
            'address' => $validated['supplier_address'],
            'locality' => $validated['supplier_locality'],
        ]);
        $validated['supplier_id'] = $supplier->id;
    }

    if (empty($validated['material_id'])) {
        $material = Material::create([
            'reference' => $validated['material_reference'],
            'name' => $validated['material_name'],
            'quantity' => $validated['quantity'],
        ]);
        $validated['material_id'] = $material->id;
    }

    Purchase::create($validated);

    return redirect()->route('purchases.index')
        ->with('status', 'Compra registada com sucesso!')
        ->with('status-type', 'success');
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    //
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    $units = Unit::all();
    $purchase = Purchase::find($id);
    $suppliers = Supplier::all();
    $materials = Material::all();

    return view('admin.purchases.edit', [
        'units' => $units,
        'purchase' => $purchase,
        'suppliers' => $suppliers,
        'materials' => $materials,
    ]);
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(StorePurchase $request, $id)
{
    $validated = $request->validated();

    $purchase = Purchase::find($id);

    $purchase->update($validated);

    return redirect()->route('purchases.index')
        ->with('status', 'Compra atualizada com sucesso!')
        ->with('status-type', 'success');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    Purchase::destroy($id);

    return redirect()->route('purchases.index')
        ->with('status', 'Compra apagada com sucesso!')
        ->with('status-type', 'success');
}
}

我知道这是相当广泛,我道歉,但我真的需要在这方面的帮助。。。这基本上就是这个应用程序的全部要点。

尝试将单位id添加到您的$fillable数组中。发生此错误的原因是units表中不存在unit_id的值。它不存在,因为laravel无法写入它,因为单元id不在可填充数组中。此数组允许laravel对该表字段进行写入操作。

请更改外键类型,以使用unsignedBigInteger作为类型。您可以尝试在架构中使外键->可为null