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 字段?

Laravel Migrations 出现异常错误

在 Laravel Migrations 中存储时区的最佳方法是啥

Laravel Migrations onDelete Restrict 不起作用