我有一个卡车桌,一个包裹桌和一个邮递员桌。卡车表和包裹表具有一对多的关系。卡车表和邮递员表具有一对一的关系。
现在我可以删除卡车表了,但是当我尝试更新 postman_name
分配了包裹的卡车数据时,我在卡车表中遇到了违反完整性约束的错误。当我尝试更改其他非外键属性或尝试更改postman_name
当前分配了零包装的卡车数据时,我没有收到错误消息。
当我尝试,我只得到了错误的更新 postman_name
上truck_number
与分配给它的包。
如何解决此错误?
里面的邮递员表格truck/edit.blade.php
:
<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>
卡车更新控制器:
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!');
}
包迁移文件:
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();
});
邮递员迁移文件:
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无法创建表
proj_db
。trucks
(错误号:150“外键约束格式不正确”)
您需要将postman_name
列更改为邮递员表上的唯一表:
$table->string('postman_name')->unique();
在卡车模型中,您需要指定外键名称和本地键名称,如下所示:
return $this->hasOne(postman::class, 'postman_name','postman_name');
更改邮递员模型中的关系
public function truck(){
return $this->belongsTo(Track::class, 'postman_name', 'postman_name');
}
在卡车模型中
public function postman(){
return $this->hasOne(Postman::class, 'postman_name', 'postman_name');
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句