es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede truncar las tablas al realizar una siembra en Laravel 7.

Me enfrento a un problema con Laravel 7 al truncar una tabla, incluso cuando he utilizado FOREIGN KEY CHECKS enable y disable, todavía devuelve este tipo de error “Error de sintaxis o violación de acceso: 1701 No se puede truncar una tabla referenciada en una restricción de clave externa.”.

Método

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

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

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

Archivo Seeder 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',
),
));
}

He actualizado la versión de Laravel de 6 a 7 y esta sintaxis funciona bien en Laravel 6, pero cuando lo actualizo a Laravel 7, deja de funcionar. Si alguien tiene idea de cuál es el problema real.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La incidencia que estás enfrentando con Laravel 7 al truncar una tabla se debe a las restricciones de clave externa presentes en la base de datos. Aunque has utilizado FOREIGN_KEY_CHECKS para habilitar y deshabilitar las comprobaciones de clave externa, sigue devolviendo el mensaje de error “Error de sintaxis o violación del acceso: 1701 No se puede truncar una tabla referenciada en una restricción de clave externa”.

    Una posible solución a este problema es deshabilitar las restricciones de clave externa antes de truncar la tabla y luego volver a habilitarlas una vez completada la truncación.

    En tu fragmento de código, ya estás deshabilitando las comprobaciones de clave externa utilizando el método DB::statement("SET FOREIGN_KEY_CHECKS=0;");. Sin embargo, el problema aún puede ocurrir debido a las restricciones de clave externa presentes en tu base de datos.

    Para resolver este problema, puedes modificar tu archivo sembrador StatusTableSeeder.php de la siguiente manera:

    public function run()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');
        DB::table('statuses')->truncate();
        DB::table('statuses')->insert([
            [
                'id' => 1,
                'name' => 'Actual',
                'type' => 'actual',
            ],
            [
                'id' => 2,
                'name' => 'Resuelto',
                'type' => 'resuelto',
            ]
        ]);
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }
    

    En este código modificado, las comprobaciones de clave externa se desactivan utilizando el método DB::statement('SET FOREIGN_KEY_CHECKS=0;'); antes de truncar la tabla. Después de la truncación e inserción, las comprobaciones de clave externa se habilitan nuevamente utilizando DB::statement('SET FOREIGN_KEY_CHECKS=1;');.

    Esta solución debería resolver el problema de truncar tablas con restricciones de clave externa en Laravel 7.

Comments are closed.