1
votes

La colonne n'existe pas Usine Laravel

J'ai une table

<?php

namespace Tests\Feature\API;

use App\User;
use Tests\TestCase;
use Laravel\Sanctum\Sanctum;
use App\Models\{Party, Place};
use Illuminate\Foundation\Testing\RefreshDatabase;

class PartiesControllerTest extends TestCase
{
    use RefreshDatabase;

    private User $user;

    protected function setUp(): void
    {
        parent::setUp();
        $this->user =  factory(User::class)->create();
    }

    public function test_get_parties()
    {
        factory(Party::class)->create([
            'place_id' => factory(Place::class)->create()->id,
        ]);

        dd(Party::all());
        Sanctum::actingAs($this->user);
    }
}

et une fabrique de modèles

    factory(Party::class, 10)->create();

Si j'appelle la méthode create dans HomeController, cela fonctionne correctement p >

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Models\Party;
use Faker\Generator as Faker;

$factory->define(Party::class, function (Faker $faker) {
    $date = $faker->dateTimeBetween(now()->subDays(3), now());

    return [
        'place_id' => $faker->numberBetween(1, 9),
        'status' => $faker->numberBetween(0, 3),
        'utc_date' => $date,
        'local_date' => \Carbon\Carbon::make($date)->addHours(3),
    ];
});

mais quand je l'appelle dans mes tests, j'ai une erreur

SQLSTATE [42703]: colonne non définie: 7 ERREUR: colonne "utc_date" de la relation "parties" n'existe pas LIGNE 1: insérer dans "parties" ("place_id", "status", "utc_date", "lo ... ^ (SQL: insérer dans "parties" ("place_id", "status", "utc_date", "local_date", "updated_at", "created_at") valeurs (5, 3, 2020-08-04 00:34:52, 2020-08-04 03:34:52, 2020-08-04 11:42:18, 2020-08-04 11:42:18) renvoyant "id")

public function up()
{
    Schema::create('parties', function (Blueprint $table) {
        $table->id();
        $table->integer('place_id');
        $table->tinyInteger('status')->default(0);
        $table->dateTime('utc_date');
        $table->dateTime('local_date');
        $table->timestamps();
    });

    Schema::table('parties', function (Blueprint $table) {
        $table->index('place_id');

        $table->foreign('place_id')
            ->references('id')
            ->on('places')
            ->onDelete('restrict');
    });
}


7 commentaires

dans votre modèle de groupe, assurez-vous que vous avez: protected $ table = 'parties';


Je l'ai. Comme je l'ai dit ci-dessus, la méthode create of the factory (Party :: class) fonctionne parfaitement si je l'appelle dans mon HomeController.php


Utilisez-vous PostgreSQL ?


Oui. J'utilise postgres


Lorsqu'il indique que la relation "parties" n'existe pas Cela se produit généralement lorsque votre table parties doit avoir été supprimée avant que la migration: reset soit annulée


Que signifie use App \ Models \ {Party, Place}; ? Je n'ai jamais vu cette syntaxe et je ne trouve rien à ce sujet sur le site officiel de PHP. Je suppose qu'il regroupe l'utilisation de différentes classes qui «vivent» dans la même carte / espace de noms. Ça a l'air, eh bien, un peu bizarre.


@DimitriMostrey Vous pouvez trouver les informations sur les espaces de noms groupés dans la documentation php officielle. Ceci est une nouvelle fonctionnalité de php7 php .net / manual / fr /…


3 Réponses :


0
votes

Essayez d'exécuter php artisan migrate: fresh . Si vous utilisez une autre base de données pour tester et utiliser un autre fichier .env , essayez d'exécuter php artisan migrate: fresh --env = testing . Par exemple: vous pouvez utiliser le fichier env.testing et APP_ENV = testing dans ce fichier.

Peut-être avez-vous ajouté ce champ plus tard et n'avez pas actualisé la base de données. Vérifiez également si le champ existe dans Visual DB. Si cela n'a pas aidé, essayez d'exécuter composer dump-autoload et réessayez.


0 commentaires

0
votes

J'utilise une deuxième base de données pour les tests. Je me suis connecté à cette base de données et j'ai constaté que cette table n'avait pas été rafraîchie. Je ne sais pas pourquoi car j'ai utilisé le trait RefreshDatabase. J'ai ajouté ce champ manuellement pour résoudre ce problème.


0 commentaires

0
votes

s'il vous plaît assurez-vous que le tableau remplissable dans le modèle a cette clé,

et essayez d'utiliser carbon au lieu de faker avec date

(Carbon::now())->subDays(3);


0 commentaires