繁体   English   中英

Laravel 8 - 由于违反完整性约束,可以删除但不能更新父行:外键约束失败

[英]Laravel 8 - CAN delete but CANNOT UPDATE parent row due to integrity constraints violation: foreign key constraint fails

我有一个卡车表、一个 package 表和一个 postman 表。 Truck 表和 package 表具有一对多的关系。 Truck 表和 postman 表具有一对一的关系。

现在我可以很好地删除卡车表,但是当我尝试更新已分配包裹的卡车数据上的postman_name时,卡车表内出现完整性约束违规错误。 当我尝试更改其他非外键属性或尝试更改当前分配了零postman_name的卡车数据上的 postman_name 时,我没有收到错误消息。

当我尝试使用分配给它的包裹更新postman_name上的truck_number时,我才收到错误消息。

我该如何解决这个错误?

truck/edit.blade.php内的 postman 表格:

<div class="form-group">
                <label for="postman_name">Postman in Charge</label>
                <select name="truck_number" class="form-control">
                <option selected disabled>-</option>
                @foreach ($postmen as $count => $postman)
                  <option value="{{$postman['postman_name']}}">{{$postman['postman_name']}}</option>
                @endforeach
                </select>
</div>

卡车更新 controller:

public function update(Request $request, $truck_id)
    {
        $request->validate([
            'truck_number'=>'required|unique:trucks,truck_id',
            'postman_name',
            'date_of_operation'=>'required'
        ]);
        $trucks = Truck::find($truck_id);
        $trucks->truck_number =  $request->get('truck_number');
        $trucks->postman_name = $request->get('postman_name');
        $trucks->date_of_operation = $request->get('date_of_operation');
        $trucks->save();
        return redirect(TRUCK)->with('success', 'Truck Updated!');
    }

Package 迁移文件:

Schema::create('packages', function (Blueprint $table) {
            $table->increments('package_id');
            $table->string('truck_number')->nullable(); 
            $table->foreign('truck_number')->references('truck_number')->on('trucks')->onDelete('cascade');
            $table->string('package_number')->unique();
            $table->string('receiver_name');
            $table->string('destination');
            $table->timestamps();
        });

postman 迁移文件:

Schema::create('postmen', function (Blueprint $table) {
            $table->increments('postman_id');
            $table->string('truck_number')->nullable();
            $table->foreign('truck_number')->references('truck_number')->on('trucks')->onDelete('cascade');
            $table->string('postman_number')->unique();
            $table->string('postman_name');
            $table->timestamps();
        });

卡车迁移文件:

Schema::create('trucks', function (Blueprint $table) {
            $table->increments('truck_id');
            $table->string('truck_number')->unique();
            $table->string('postman_name')->nullable();
            $table->date('date_of_operation');
            $table->timestamps();
        });

楷模:

class postman extends Model
{

    use HasFactory;
    protected $primaryKey = 'postman_id';

    protected $fillable = ['truck_number','postman_number','postman_name'];

    public function Truck(){
        return $this->belongsTo(Truck::class);
    }
}

class Package extends Model
{
    use HasFactory;
    protected $primaryKey = 'package_id';

    protected $fillable = ['truck_number', 'package_number', 'receiver_name', 'destination'];
    
     public function Truck(){
        return $this->belongsTo(Truck::class);
    }

}

class Truck extends Model
{
    use HasFactory;
    protected $primaryKey = 'truck_id';
    protected $fillable = ['truck_number', 'postman_name', 'date_of_operation', 'status'];
    
     public function Package()
    {
        return $this->hasMany(Package::class, 'truck_number', 'truck_number');
    }

     public function postman()
    {
        return $this->hasOne(postman::class, 'truck_number', 'truck_number');
    }

}

注意:顺便说一句,我也无法添加$table->foreign('postman_name')->references('postman_name')->on('postmen')->onDelete('cascade'); 到卡车迁移文件。 当我这样做时它会抛出这个错误:

SQLSTATE[HY000]: 一般错误: 1005 Can't create table proj_db trucks (错误号:150“外键约束格式不正确”)

您需要将postman_name列更改为在 postmen 表上是唯一的:

$table->string('postman_name')->unique();

在您的 Truck model 中,您需要指定外键名称和本地键名称,如下所示:

return $this->hasOne(postman::class, 'postman_name','postman_name');

更改您在 postman Model 中的关系

public function truck(){
    return $this->belongsTo(Track::class, 'postman_name', 'postman_name');
}

和卡车 model

public function postman(){
    return $this->hasOne(Postman::class, 'postman_name', 'postman_name');
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM