Laravel Migrations onDelete Restrict 不起作用
Posted
技术标签:
【中文标题】Laravel Migrations onDelete Restrict 不起作用【英文标题】:Laravel Migrations onDelete Restrict not working 【发布时间】:2018-08-29 00:02:14 【问题描述】:您好,我正在尝试在迁移中定义关系
我正在使用删除限制来防止在孩子存在时删除父记录。但它不工作。例如,我有这个具有版本(子)的事件表(父)。我在版本表中使用 event_id
与onDelete('restrict')
并在我的版本表中有event_id ..
只要记录在版本表中有子记录,它应该限制我从事件表中删除吗?但它不是..
这是两个表的迁移
事件(父)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEventsTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('events', function (Blueprint $table)
//master table
$table->increments('event_id');
$table->string('name');
$table->text('full_name');
$table->text('description');
$table->tinyInteger('status');
$table->integer('created_by');
$table->integer('updated_by');
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('events');
版本(儿童)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEditionsTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('editions', function (Blueprint $table)
$table->increments('edition_id');
$table->integer('event_id')->unsigned();
$table->string('name');
$table->dateTime('start')->nullable();
$table->dateTime('end')->nullable();
$table->enum('stage', ['Archived', 'Cancelled', 'Closed', 'Live', 'On-site', 'Pre-event', 'Sold out'])->nullable()->default('Pre-event');
$table->tinyInteger('status');
$table->integer('created_by');
$table->integer('updated_by');
$table->timestamps();
);
Schema::table('editions', function($table)
$table->foreign('event_id')
->references('event_id')->on('events')
->onDelete('restrict')->onUpdate('restrict');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('editions');
【问题讨论】:
表引擎是InnoDB
吗?
这个公认的答案可能对你有用***.com/questions/13105019/…
你使用SoftDeletes
trait吗?
默认约束是一个限制,所以一定要使用默认值***.com/a/8073114/5189811
我使用软删除,但不在这两种模式中。
【参考方案1】:
据此thread:
如果您使用 SoftDeletes 特征,则调用 delete() 您的模型上的方法只会更新您的 deleted_at 字段 数据库,并且不会触发 onDelete 约束,给定 它是在数据库级别触发的,即当 DELETE 查询 执行。
所以请确保您使用DELETE
而不是SoftDeletes
否则您可以手动添加约束。
【讨论】:
我知道,但我也尝试过直接从数据库中删除(sequel pro).. 不影响【参考方案2】:我发现您的外键定义中缺少的一件事是在其上添加索引,这是对外键的要求,这可能是您遇到问题的原因。
尝试改变
$table->integer('event_id')->unsigned();
到
$table->integer('event_id')->unsigned()->index();
另外,您可以在列定义之后立即添加外键定义,无需将其放在不同的Schema::table()
块中。
【讨论】:
它没有用。我的代码正在添加约束。它甚至显示在数据库中。但它不限制删除..(我尝试从 phpmyadmin、sequel pro、应用程序中删除)它允许无处不在。即使 phpmyadmin 说 ON DELETE RESTRICT 您在执行上述删除操作时是否禁用了外键检查?尝试在服务器SET FOREIGN_KEY_CHECKS=1;
上运行此 SQL 命令并重试
我没有。但是我重新启动了 mysql 服务器并解决了问题。所有约束现在都在起作用。谢谢以上是关于Laravel Migrations onDelete Restrict 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 在“app/database/migrations”文件夹上递归运行迁移
text Laravel Artisan Migrations,控制器
有没有办法使用 Laravel 5 Migrations 创建一个 citext 字段?