2 votes

laravel 8 seeding , SQLSTATE[23000] : Violation d'une contrainte d'intégrité :

J'ai rétrogradé mon projet de Laravel. 7 à 8 . mais le problème est que lorsque je lance la commande d'ensemencement php artisan db:seed il affiche une erreur SQLSTATE [23000] : Violation de la contrainte d'intégrité : . c'est parce qu'il ensemence les données d'ensemencement précédentes que j'exécute avant. J'ai aussi fait avant de lancer la commande d'ensemencement

  1. Ajouter une base de données \Seeders espace de nom en haut de DatabaseSeeder.php et des autres fichiers Seeder

  2. Remplacer le nom du dossier "seeds" par "seeders" situé à l'adresse suivante \database\ dossier

  3. Mettez à jour composer.json comme ci-dessous :

    "autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }

    },

  4. Enfin, exécutez les commandes suivantes

    compositeur dump-autoload

    php artisan db:seed

J'ai également modifié le Base de donnéesSeeder commande $this->call(DeliveryAddressTableSeeder::class) ;

DeliveryAddressTableSeeder

    <?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\DeliveryAddress;

class DeliveryAddressTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        $deliveryRecords = [
            ['id' => 1, 'user_id' => 1, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
        ];

        DeliveryAddress::insert($deliveryRecords);
    }
}

0voto

Jaswinder Singh Points 709

Je pense que la migration DeliveryAddress aura les colonnes avec la déclaration $table->id() ;. Dans ce cas, votre seeder, lorsqu'il est exécuté plusieurs fois, insère une valeur en double dans la colonne id.

Soit vous pouvez tronquer la table avant de lancer votre seeder .

    <?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\DeliveryAddress;

class DeliveryAddressTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DeliveryAddress::truncate();
        //
        $deliveryRecords = [
            ['id' => 1, 'user_id' => 1, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
        ];

        DeliveryAddress::insert($deliveryRecords);
    }
}

ou vous pouvez sauter l'insertion de la valeur de la colonne id puisqu'il s'agit d'une valeur auto incrémentée.

 public function run()
  {

        $deliveryRecords = [
                ['user_id' => 1, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
            ];

        DeliveryAddress::insert($deliveryRecords);
  }

Vérifiez également si la colonne user_id est soumise à une contrainte de clé étrangère. Si oui, vous devez avoir un enregistrement pour la table users avec l'id "1" pour éviter toute donnée erronée.

-1voto

Michael Mano Points 758
        Eloquent::unguard();

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

        $this->call('YourTTableSeeder');

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

Mettez-les dans vos semoirs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X