在 laravel 7 中播种时无法截断表格

Posted

技术标签:

【中文标题】在 laravel 7 中播种时无法截断表格【英文标题】:Can't able to truncating tables when seeding in laravel 7 【发布时间】:2022-01-12 05:41:51 【问题描述】:

我在截断表时遇到了 laravel 7 的问题,即使我使用了 FOREIGN_KEY_CHECKS 启用和禁用仍然返回这种类型的错误“语法错误或访问冲突:1701 无法截断外键约束中引用的表”。

方法

DB::statement("SET FOREIGN_KEY_CHECKS=0;");

Artisan::call('db:seed', ["--database" => 'DBNAME', '--force' => true, "--class" => 'StatusTableSeeder']);

DB::statement("SET FOREIGN_KEY_CHECKS=1;");

种子文件 StatusTableSeeder.php

public function run()

    \DB::table('statuses')->truncate();
    \DB::table('statuses')->insert(array (
            0 => 
            array (
                'id' => 1,
                'name' => 'Current',
                'type' => 'current',
            ),
            1 => 
            array (
                'id' => 2,
                'name' => 'Resolved',
                'type' => 'resolved',
            ),
       ));

我已经将 laravel 版本 6 更新到了 7,这种语法在 laravel 6 中运行良好,但是当我将它更新到 laravel 7 之后,它就可以工作了。如果有人知道它的实际问题是什么

【问题讨论】:

可能是其他表将具有截断表的外键。 @DevsiOdedra 是的,但是我有 FOREIGN_KEY_CHECKS=0 它在 laravel 6 中运行良好这个问题只出现在 laravel 7 中 阅读参考手册并研究TRUNCATE 语句是如何真正执行的。你会明白中间 DB 状态是不一致的。 【参考方案1】:

试试这个:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class StatusTableSeeder extends Seeder

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    
        Schema::disableForeignKeyConstraints();
        DB::table('statuses')->truncate();
        Schema::enableForeignKeyConstraints();

        // and the rest of your code...
    


【讨论】:

以上是关于在 laravel 7 中播种时无法截断表格的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 Jetstream:无法使用使用工厂和播种机播种的帐户登录

在 laravel 中播种时的质量分配错误

Laravel 5 - 部署应用程序后如何自动播种表?

Laravel 5.7 在播种机中使用 Passport 进行测试

使用 Laravel 5 中的 --force 进行生产时,数据库卡在使用播种机迁移

播种时LARAVEL 5.4 SQL“找不到列”