laravel 上的第一个项目:当我要删除行时,它会抛出错误:SQLSTATE[23000]:完整性约束违规:1451 无法删除或更新父行:外键约束失败。我的控制器功能
public function delete(Request $request) {
try {
Venue::findOrFail($request->id)->delete();
} catch (\Exception $ex) {
return response()->json([
'error' => $ex->getCode(),
'message' => $ex->getMessage()
]);
}
return response()->json([
'message' => trans('admin.venue.delete_success')
]);
}
Run Code Online (Sandbox Code Playgroud)
模型 :
protected static function boot()
{
parent::boot();
self::deleting(function (Venue $venue) {
$venue->occasions()->delete();
$venue->contact()->delete();
$venue->gallery()->delete(); // here i am gtng error
$venue->venueParameter()->delete();
});
}
Run Code Online (Sandbox Code Playgroud)
详细错误:
SQLSTATE[23000]: 完整性约束冲突: 1451 无法删除或更新父行: 外键约束失败 (
red_carpet.media, CONSTRAINTmedia_gallery_id_foreignFOREIGN KEY (gallery_id) REFERENCESgalleries(id)) (SQL: 从galleries.galleries=source_id2 且galleries.source_id不为空且galleries.source_type=应用程序\地点)
表的架构:
Schema::create('venues', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('client_id');
$table->string('name');
$table->string('logo');
$table->unsignedInteger('venue_type_id');
$table->boolean('is_premium');
$table->boolean('is_verified');
$table->string('tripadvisor_url')->nullable();
$table->enum('status',['Active','Inactive']);
$table->timestamps();
$table->foreign('client_id')->references('id')->on('clients');
$table->foreign('venue_type_id')->references('id')->on('venue_types');
});
Schema::create('galleries', function (Blueprint $table) {
$table->increments('id');
$table->string('source_type');
$table->unsignedInteger('source_id');
$table->string('title');
$table->unsignedInteger('sort_order');
$table->enum('status',['Active','Inactive']);
$table->timestamps();
});
Schema::create('media', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('gallery_id');
$table->enum('type',['Image','Video']);
$table->string('caption');
$table->string('path')->nullable();
$table->string('thumbnail')->nullable();
$table->longText('video_code')->nullable();
$table->boolean('is_banner_image')->default(false);
$table->boolean('is_thumb_image')->default(false);
$table->unsignedInteger('sort_order');
$table->enum('status',['Active','Inactive']);
$table->timestamps();
$table->foreign('gallery_id')->references('id')->on('galleries');
});
Run Code Online (Sandbox Code Playgroud)
如果您从一个表中删除与另一表链接的项目,则会出现此错误。
如果您使用的是数据透视表,请使用 onDelete('cascade') ,例如,
$table->foreign('foreign_key')->references('primary_key')->on('table_name')->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)
参考: