Колонка не существует Laravel Завод - PullRequest
1 голос
/ 04 августа 2020

У меня есть таблица

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

и фабрика модели

<?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),
    ];
});

Если я вызываю метод create в HomeController, он работает правильно

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

но когда Я называю это в своих тестах. Я получил ошибку

SQLSTATE [42703]: Неопределенный столбец: 7 ОШИБКА: столбец «utc_date» отношения «стороны» не существует СТРОКА 1: вставить в «стороны» («place_id», «status», «utc_date», «lo ... ^ (SQL: вставить в« party »(« place_id »,« status »,« utc_date »,« local_date »,« updated_at », "created_at") значения (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) возвращает id)

<?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);
    }
}

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Я использую вторую базу данных для тестирования. Я подключился к этой базе данных и обнаружил, что эта таблица не обновлялась. Не знаю почему, потому что я использовал черту RefreshDatabase. Я добавил это поле вручную для решения этой проблемы.

0 голосов
/ 04 августа 2020

убедитесь, что заполняемый массив в модели имеет этот ключ,

, и попробуйте использовать углерод вместо faker с датой

(Carbon::now())->subDays(3);
0 голосов
/ 04 августа 2020

Попробуйте запустить php artisan migrate:fresh. Если вы используете другую базу данных для тестирования и используете другой файл .env, попробуйте запустить php artisan migrate:fresh --env=testing. Например: внутри этого файла можно использовать файлы env.testing и APP_ENV=testing.

Возможно, вы добавили это поле позже и не обновляли sh DB. Также проверьте, существует ли поле в визуальной БД. Если это не помогло, попробуйте запустить composer dump-autoload и повторите попытку.

...