Migracja: nie można dodać ograniczenia klucza obcego

Próbuję utworzyć klucze obce w Laravel jednak podczas migracji tabeli za pomocą artisan pojawia się następujący błąd:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `priorities` add constraint priorities_user_id_foreign foreign 
key (`user_id`) references `users` (`id`))     

Mój kod migracji jest taki:

Plik migracji priorytetów

public function up()
{
    //
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

Plik migracji użytkowników

public function up()
{
    //
    Schema::table('users', function($table)
    {
    $table->create();
    $table->increments('id');
    $table->string('email');
    $table->string('first_name');
    $table->string('password');
    $table->string('email_code');
    $table->string('time_created');
    $table->string('ip');
    $table->string('confirmed');
    $table->string('user_role');
    $table->string('salt');
    $table->string('last_login');

    $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
        Schemea::drop('users');
}

Wszelkie pomysły na to, co zrobiłem źle, chcę dostać to teraz, ponieważ mam wiele tabel, które muszę stworzyć np. użytkownicy, klienci, projekty, zadania, statusy, priorytety, typy, zespoły. Najlepiej chcę tworzenie tabel, które przechowują te dane za pomocą kluczy obcych, i..e clients_project i project_tasks itd.

Mam nadzieję, że ktoś pomoże mi zacząć.
Author: Uwe Keim, 2014-03-24

30 answers

Dodaj go w dwóch krokach, a dobrze, że też jest niepodpisany:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });

   Schema::table('priorities', function($table) {
       $table->foreign('user_id')->references('id')->on('users');
   });

}
 375
Author: Antonio Carlos Ribeiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 17:12:12

Pytanie już odpowiedział, Ale mam nadzieję, że to może pomóc komuś innemu.

Ten błąd wystąpił u mnie, ponieważ najpierw utworzyłem tabelę migracji z kluczem obcym, zanim klucz istniał jako klucz podstawowy w oryginalnej tabeli. Migracje są wykonywane w kolejności, w jakiej zostały utworzone zgodnie z nazwą pliku wygenerowanego po uruchomieniu migrate:make. Np. 2014_05_10_165709_create_student_table.php.

Rozwiązaniem była zmiana nazwy pliku z kluczem obcym na wcześniejszą niż Plik z kluczem głównym zgodnie z zaleceniami tutaj: http://forumsarchive.laravel.io/viewtopic.php?id=10246

Myślę, że też musiałem dodać $table->engine = 'InnoDB';

 120
Author: haakym,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-10 22:51:39

Laravel ^5.8

Od wersji Laravel 5.8, stuby migracji używają metody bigIncrements na ID kolumny domyślnie. Wcześniej kolumny ID były tworzone przy użyciu metoda przyrostów.

Nie wpłynie to na żaden istniejący kod w Twoim projekcie; jednak, być świadomość, że kolumny klucza obcego MUSZĄ BYĆ tego samego typu. W związku z tym kolumna utworzona przy użyciu metody increments nie może odwoływać się do kolumny created using the bigIncrements metoda.

źródło:


Przykład

Wyobraźmy sobie, że budujesz prostą aplikację opartą na rolach i musisz odwołać się do user_id w tabeli PIVOT "role_user".

2019_05_05_112458_create_users_table.php

// ...

public function up()
{
    Schema::create('users', function (Blueprint $table) {

        $table->bigIncrements('id');

        $table->string('full_name');
        $table->string('email');
        $table->timestamps();
    });
}

2019_05_05_120634_create_role_user_pivot_table.php

// ...

public function up()
{
    Schema::create('role_user', function (Blueprint $table) {

        // this line throw QueryException "SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint..."
        // $table->integer('user_id')->unsigned()->index();

        $table->bigInteger('user_id')->unsigned()->index(); // this is working
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

Jak widać, w komentowanej linii pojawi się wyjątek zapytania, ponieważ, jak wspomniano w Uwagach dotyczących aktualizacji, kolumny klucza obcego MUSZĄ BYĆ tego samego typu, dlatego musisz albo zmienić klucz foreing (w tym przykładzie jest to user_id) na bigInteger w tabeli role_user lub zmienić metodę bigIncrements na przyrosty metoda w tabeli users i użyj linii komentarza w tabeli przestawnej, to zależy od Ciebie.


I hope i był w stanie wyjaśnić tę kwestię do ciebie.

 74
Author: chebaby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-09 17:20:48

W moim przypadku problem polegał na tym, że główna tabela miała już w sobie rekordy i zmuszałem nową kolumnę, aby nie była NULL. Więc dodanie ->nullable () do nowej kolumny załatwiło sprawę. W przykładzie pytania byłoby coś takiego:

$table->integer('user_id')->unsigned()->nullable();

Lub:

$table->unsignedInteger('user_id')->nullable();

Mam nadzieję, że to komuś pomoże!
 52
Author: AdrianCR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 06:20:40

W moim przypadku problem polegał na tym, że automatycznie wygenerowana migracja dla Tabeli users ustawiała

...
$table->bigIncrements('id');
...

Więc musiałem zmienić typ kolumny


$table->bigInteger('id');
Aby moja migracja z kluczem obcym zadziałała.

To z laravelem 5.8.2

 22
Author: Daniele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-20 11:01:42

W moim przypadku problem był z czasem migracji być ostrożnym podczas tworzenia migracji najpierw utworzyć migrację dziecka niż migracji bazowej. Ponieważ jeśli najpierw utworzysz migrację bazową, która ma twój klucz obcy, będzie szukać tabeli potomków i nie będzie tabeli, która następnie rzuci wyjątek.

Więcej:

Kiedy tworzysz migrację, na jej początku znajduje się znacznik czasu. powiedzmy, że stworzyłeś migrację cat więc będzie ona wyglądać jak 2015_08_19_075954_the_cats_time.php i ma ten kod

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class TheCatsTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cat', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');  
            $table->date('date_of_birth');
            $table->integer('breed_id')->unsigned()->nullable(); 
        });

        Schema::table('cat', function($table) {
        $table->foreign('breed_id')->references('id')->on('breed');
      });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('cat');
    }
}

I po utworzeniu tabeli bazowej tworzysz kolejną migrację , która jest tabelą potomną, która ma własny znacznik czasu i daty utworzenia. Kod będzie wyglądał następująco:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class BreedTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('breed', function (Blueprint $table) {
             $table->increments('id');    
             $table->string('name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('breed');
    }
}

Wydaje się, że obie te tabele są poprawne, ale po uruchomieniu PHP artisan migrate . Spowoduje to rzucenie wyjątku, ponieważ migracja najpierw utworzy tabelę bazową w Twojej bazie danych, ponieważ najpierw utworzyłeś tę migrację, a nasza tabela bazowa ma ograniczenie klucza obcego w nim, który będzie szukać tabeli potomnych i tabeli potomnych nie istnieje, co prawdopodobnie jest wyjątkiem..

Więc:

Najpierw Utwórz migrację tabeli potomnej.

Utwórz migrację tabeli bazowej po utworzeniu migracji Potomków.

PHP artisan migrate.

Done it will work

 20
Author: Vicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

W laravel 5.8, users_table używa typu danych bigIncrements('id') dla klucza głównego. Tak więc, jeśli chcesz odwołać się do ograniczenia klucza obcego, twoja kolumna user_id musi być typu unsignedBigInteger('user_id').

 18
Author: Dhara Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-20 06:19:16

Miałem problem z laravel 5.8 i naprawiłem ten kod, jak pokazano tutaj w dokumentacji Laravel , gdzie kiedykolwiek dodaję klucz obcy.

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

Potem uciekłem $ php artisan migrate:refresh

Ponieważ ta składnia jest dość zwięzła, Laravel zapewnia dodatkowe, terserowe metody, które używają konwencji, aby zapewnić lepsze wrażenia programistów. Powyższy przykład można napisać tak:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
});
 14
Author: Slycreator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-25 15:19:12

W moim przypadku po prostu zmieniam kolejność migracje są wykonywane ręcznie, więc użytkownicy tabeli są tworzone jako pierwsi.

W folderze baza danych/ migracje / Twoja nazwa pliku migracji ma taki format: year_month_day_hhmmss_create_XXXx_table.php

Wystarczy zmienić nazwę Utwórz plik użytkownika, aby Data utworzenia tabeli priorytetów była ustawiona później niż data użytkownika (wystarczy nawet sekunda później)

 13
Author: ldt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-03 09:52:50

Miałem ten sam problem używając Laravel 5.8. po bliższym przyjrzeniu się Laravel docs, ponadto tutaj Migrations & bigIncrements. Sposób, w jaki go rozwiązałem, polega na dodaniu kluczy głównych "$table->bigIncrements('id')" do każdej tabeli, która jest powiązana z tabelą "users" i jej asocjacjami, w moim przypadku tabelą "role". Na koniec miałem "$table - >unsignedBigInteger " do kojarzenia ról z użytkownikami (Many-to-Many), czyli table "role_user" .

1. Users table

    Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

2. Roles Table
    Schema::create('roles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name')->unique();
        $table->string('display_name')->nullable();
        $table->string('description')->nullable();
        $table->timestamps();
    });

3. Table role_user
Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('role_id');
            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('roles')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->primary(['user_id', 'role_id']);
        });
 13
Author: Capfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-06 14:03:53

Ten błąd wystąpił dla mnie, ponieważ-podczas gdy tabela, którą próbowałem stworzyć był InnoDB-zagraniczna tabela próbowałem odnieść go do był MyISAM tabeli!

 7
Author: bagnap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 09:56:02

Używanie Laravel 5.3 miało ten sam problem.

Rozwiązaniem było użycie unsignedInteger zamiast integer('nazwa')->unsigned () .

Więc to działa

$table->unsignedInt('column_name');
$table->foreign('column_name')->references('id')->on('table_name');

Powodem tego działania jest fakt, że przy użyciu integer('name')->unsigned kolumna utworzona w tabeli miała długość 11, natomiast przy użyciu unsigedInteger('name') kolumna miała długość 10.

Length 10 jest długością dla kluczy podstawowych podczas używania Laravela, więc dopasowana długość kolumn.

 7
Author: Radu Diță,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 08:24:30

Nie możemy dodawać relacji, chyba że zostaną utworzone powiązane tabele. Laravel Uruchom migracje kolejność według daty migracji plików. Więc jeśli chcesz utworzyć relację z tabelą, która istnieje w 2. pliku migracji, to się nie powiedzie.

Spotkałem się z tym samym problemem, więc w końcu stworzyłem jeszcze jeden plik migracji, aby określić wszystkie relacje.

Schema::table('properties', function(Blueprint $table) {
        $table->foreign('user')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('area')->references('id')->on('areas')->onDelete('cascade');
        $table->foreign('city')->references('id')->on('cities')->onDelete('cascade');
        $table->foreign('type')->references('id')->on('property_types')->onDelete('cascade');
    });

    Schema::table('areas', function(Blueprint $table) {
        $table->foreign('city_id')->references('id')->on('cities')->onDelete('cascade');
    });
 6
Author: pavan kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-04 08:33:16

Powinieneś pisać w ten sposób

public function up()
{
    Schema::create('transactions', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->float('amount', 11, 2);
        $table->enum('transaction type', ['debit', 'credit']);
        $table->bigInteger('customer_id')->unsigned();      
        $table->timestamps();                 
    });

    Schema::table('transactions', function($table) {
        $table->foreign('customer_id')
              ->references('id')->on('customers')
              ->onDelete('cascade');
    });     
}

Pole klucza obcego powinno być unsigned , mam nadzieję, że to pomoże!!

 6
Author: Mahesh Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-03 11:04:57

Bądź świadomy: kiedy Laravel ustawia tabelę za pomocą

$table->increments('id');

, który jest standardem w większości migracji, utworzy pole unsigned integer. Dlatego podczas tworzenia obcego odniesienia z innej tabeli do tego pola, upewnij się, że w tabeli odniesienia ustawisz pole na UnsignedInteger i not (co założyłem, że jest) UnsignedBigInteger.

Na przykład: w pliku migracji 2018_12_12_123456_create_users_table.php:

Schema::create('users', function (Blueprint $table){
    $table->increments('id');
    $table->string('name');
    $table->timestamps();

Następnie w pliku migracji 2018_12_12_18000000_create_permission_table.php, który ustawia zagraniczne odniesienie z powrotem do użytkowników:

Schema::create('permissions', function (Blueprint $table){
    $table->increments('id');
    $table->UnsignedInteger('user_id'); // UnsignedInteger = "increments" in users table
    $table->boolean('admin');
    $table->boolean('enabled');
    $table->timestamps();

    // set up relationship
    $table->foreign('user_id')->reference('id')->on('users')->onDelete('cascade');
}
 5
Author: bnoeafk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-28 21:23:57

Do dodawania ograniczenia klucza obcego w laravelu zadziałało dla mnie:

  1. Utwórz kolumnę jako klucz obcy w następujący sposób:

    $table->integer('column_name')->unsigned();
  2. Dodawanie linii ograniczenia bezpośrednio po (1) tj.

    $table->integer('column_name')->unsigned();
    $table->foreign('column_name')->references('pk_of_other_table')->on('other_table');
 4
Author: bmnepali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-18 10:42:29

Wiem, że to stare pytanie, ale upewnij się, że jeśli pracujesz z referencjami, odpowiedni silnik wspierający jest zdefiniowany. set innodb engine for both tables and same data type for the reference columns

$table->engine = 'InnoDB';
 3
Author: di3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 13:15:22

Jedną rzeczą, którą zauważyłem jest to, że jeśli tabele używają innego silnika niż ograniczenie klucza obcego nie działa.

Na przykład, jeśli jedna z tabel używa:

$table->engine = 'InnoDB';

I inne zastosowania

$table->engine = 'MyISAM';

Wygeneruje błąd:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

Możesz to naprawić, dodając InnoDB na końcu tworzenia tabeli w następujący sposób:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedInteger('business_unit_id')->nullable();

        $table->string('name', 100);

        $table->foreign('business_unit_id')
                ->references('id')
                ->on('business_units')
                ->onDelete('cascade');

        $table->timestamps();
        $table->softDeletes();
        $table->engine = 'InnoDB'; # <=== see this line
    });
}
 3
Author: erlandmuchasaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-11 11:02:26

Wchodząc tutaj kilka lat po pierwotnym pytaniu, używając laravel 5.1, miałem ten sam błąd, ponieważ moje migracje były generowane komputerowo z tym samym kodem daty. Przejrzałem wszystkie proponowane rozwiązania, a następnie zrefakturowałem, aby znaleźć źródło błędu.

Po laracasts i czytając te posty uważam, że prawidłowa odpowiedź jest podobna do odpowiedzi Vickies, z tym wyjątkiem, że nie trzeba dodawać osobnego wywołania schematu. Nie musisz nakrywać stołu do Innodb, jestem zakładając, że laravel to teraz robi.

Migracje muszą być odpowiednio ustawione w czasie, co oznacza, że zmodyfikujesz kod daty (później) w nazwie pliku dla tabel, na których potrzebne są klucze obce. Alternatywnie lub dodatkowo obniż kod daty dla tabel, które nie potrzebują kluczy obcych.

Zaletą modyfikacji kodu daty Jest to, że kod migracji będzie łatwiejszy do odczytania i utrzymania.

Jak na razie mój kod działa, dostosowując kod czasu do push back migracje wymagające kluczy obcych.

Jednak mam setki stołów, więc na samym końcu mam jeden ostatni stół dla tylko zagranicznych kluczy. Tylko po to, żeby wszystko popłynęło. Zakładam, że wciągnę je do odpowiedniego pliku i zmodyfikuję kod daty podczas ich testowania.

Tak więc przykład: plik 2016_01_18_999999_create_product_options_table. Ten wymaga stworzenia tabeli produktów. Spójrz na nazwy plików.

 public function up()
{
    Schema::create('product_options', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('product_attribute_id')->unsigned()->index();
        $table->integer('product_id')->unsigned()->index();
        $table->string('value', 40)->default('');
        $table->timestamps();
        //$table->foreign('product_id')->references('id')->on('products');
        $table->foreign('product_attribute_id')->references('id')->on('product_attributes');
        $table->foreign('product_id')->references('id')->on('products');


    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('product_options');
}

Tabela produktów: to musi najpierw migrować. 2015_01_18_000000_create_products_table

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');

        $table->string('style_number', 64)->default('');
        $table->string('title')->default('');
        $table->text('overview')->nullable();
        $table->text('description')->nullable();


        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('products');
}

I na koniec plik, którego tymczasowo używam do rozwiązywania problemów, który będę refaktorował, pisząc testy dla modeli, które nazwałem 9999_99_99_99_9999_create_foreign_keys.php. Te klucze są komentowane, gdy je wyciągałem, ale rozumiesz o co chodzi.

    public function up()
    {
//        Schema::table('product_skus', function ($table) {
//            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
//    });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
//        Schema::table('product_skus', function ($table)
//        {
//            $table->dropForeign('product_skus_product_id_foreign');
//        });
 2
Author: Iannazzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-13 19:48:45

To takie proste !!!

Jeśli po raz pierwszy utworzysz plik migracji 'priorities', Laravel najpierw uruchomi 'priorities', A 'users' tabela nie istnieje.

Jak można dodać relację do tabeli, która nie istnieje!.

Rozwiązanie: wyciągnij Kody klucza obcego z tabeli 'priorities'. Twój plik migracji powinien wyglądać tak:

Tutaj wpisz opis obrazka

I dodać do nowego pliku migracji, tutaj jego nazwa to {[5] } i dodać te kody:

public function up()
{        
    Schema::table('priorities', function (Blueprint $table) {          
        $table->foreign('user_id')
              ->references('id')
              ->on('users');                        
    });
}
 2
Author: josef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 07:17:30

Upewnij się, że kolumna przednia jest nad szeroką kolumną przednią

I oznacza, że Twój foreingkey (w drugiej tabeli) musi być tego samego typu, co twój ponter pricipal key (w pierwszej tabeli)

Twój klucz główny pointera musi być metodą add unsigned, pozwól mi pokazać:

Na pierwszej tabeli migracji:

$table->increments('column_name'); //is INTEGER and UNSIGNED

Na drugiej tabeli migracji:

$table->integer('column_forein_name')->unsigned(); //this must be INTEGER and UNSIGNED
$table->foreign('column_forein_name')->references('column_name')->on('first_table_name');

INNY PRZYKŁAD, ABY ZOBACZYĆ RÓŻNICĘ

Na pierwszej tabeli migracji:

$table->mediumIncrements('column_name'); //is MEDIUM-INTEGER and UNSIGNED

On your SECOND tabela migracji:

$table->mediumInteger('column_forein_name')->unsigned(); //this must be MEDIUM-INTEGER and UNSIGNED
$table->foreign('column_forein_name')->references('column_name')->on('first_table_name');

ZOBACZ ZAKRESY TABEL TYPÓW NUMERYCZNYCH MYSQL

 2
Author: Rubén Ruíz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-03 07:49:11

Jeśli żadne z powyższych rozwiązań nie działa dla początkujących sprawdź, czy oba identyfikatory mają ten sam typ: both are integer lub both are bigInteger,... Można mieć coś takiego:

Main Table (users for example)

$table->bigIncrements('id');

Tabela podrzędna (np. priorytety)

$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

To zapytanie nie powiedzie się, ponieważ users.id jest BIG INTEGER, podczas gdy priorities.user_id jest INTEGER.

Właściwe zapytanie w tym przypadku będzie następujące:

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
 2
Author: Waiyl Karim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 22:48:13

Może to być również kolejność migracji tworzenia. Jeśli najpierw utworzysz tabelę priorytetów, a po tabeli użytkowników, to będzie źle. Z powodu pierwszej migracji szuka tabeli użytkowników. Więc musisz zmienić kolejność migracji na

app/database/migrations

Katalog

 2
Author: Turan Zamanlı,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-28 11:49:33

Dla mnie problem polegał na tym, że stary stół używał MyISAM, a nie InnoDB. This fixed it

    $tables = [
        'table_1',
        'table_2'
    ];

    foreach ($tables as $table) {
        \DB::statement('ALTER TABLE ' . $table . ' ENGINE = InnoDB');
    }
 2
Author: Dazzle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-05 13:40:48

W moim przypadku odnosiłem się do liczby całkowitej id column on a string user_id kolumna. Zmieniłem:

$table->string('user_id')

Do:

$table->integer('user_id')->unsigned();

Mam nadzieję, że to komuś pomoże!
 1
Author: Raphael Rafatpanah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 15:11:14

Gist polega na tym, że metoda obca wykorzystuje ALTER_TABLE do przekształcenia istniejącego wcześniej pola w klucz obcy. Musisz więc zdefiniować typ tabeli przed zastosowaniem klucza obcego. Jednak nie musi być w osobnym wywołaniu Schema::. Możesz zrobić zarówno wewnątrz create, jak i tak:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

Należy również pamiętać, że typ user_id jest ustawiony na unsigned, aby pasował do klucza obcego.

 1
Author: Menasheh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-05 18:27:51

Możesz bezpośrednio przekazać parametr boolean w kolumnie integer mówiąc, że powinien być niepodpisany lub nie. W laravel 5.4 następujący kod rozwiązał mój problem.

        $table->integer('user_id', false, true);

Tutaj drugi parametr false oznacza, że nie powinien być automatycznie zwiększany, a trzeci parametr true oznacza, że powinien być niepodpisany. Możesz zachować ograniczenie klucza obcego w tej samej migracji lub oddzielić je. Działa na obu.

 1
Author: Mohit Satish Pawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 12:59:04

W moim przypadku nie zadziałało dopóki nie uruchomiłem komendy

composer dump-autoload

W ten sposób możesz zostawić klucze obce wewnątrz schematu tworzenia

public function up()
{
    //
     Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
 }

 /**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}
 1
Author: Vladimir Salguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 18:01:37

Dla mnie kolumna tabeli, do której odwołuje się moja tabela potomna, nie była indeksowana.

Schema::create('schools', function (Blueprint $table) {
    $table->integer('dcid')->index()->unque();
    $table->integer('school_number')->index(); // The important thing is that this is indexed
    $table->string('name');
    $table->string('abbreviation');
    $table->integer('high_grade');
    $table->integer('low_grade');
    $table->timestamps();
    $table->primary('dcid');
});

Schema::create('students', function (Blueprint $table) {
      $table->increments('id');
      $table->integer('dcid')->index()->unique()->nullable();
      $table->unsignedInteger('student_number')->nullable();
      $table->integer('schoolid')->nullable();
      $table->foreign('schoolid')->references('school_number')->on('schools')->onDelete('set null');
      // ...
});

Zignoruj straszne nazewnictwo, to z innego strasznie zaprojektowanego systemu.

 1
Author: Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-04 02:35:35

Czasami ten błąd może wynikać z sekwencji migracji.

Podobnie jak użytkownicy i kolejność to dwie tabele

Tabela porządkowa ma dla użytkowników klucz (Podczas migracji, jeśli najpierw migracja tabeli zleceń spowoduje problem, ponieważ nie ma użytkowników dopasowujących klucz obcy)

Rozwiązanie: Po prostu umieść tabelę aktualizacji zamówienia w sekcji Użytkownicy dla aktualizacji

Przykład: W moim przypadku tablice edukacyjne i Uniwersyteckie Tabela Edukacyjna

public function up()
{
    Schema::create('doc_education', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('uni_id')->unsigned()->nullable();
        $table->timestamps();
    });
}

W Uniwersytet

    Schema::create('doc_universties', function (Blueprint $table) {
        $table->increments('id');
        $table->string('uni_name');
        $table->string('location')->nullable();
        $table->timestamps();

        //
    });



Schema::table('doc_education', function(Blueprint $table) {
        $table->foreign('uni_id')->references('id')
        ->on('doc_universties')->onDelete('cascade');
    });
 1
Author: BlockCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-23 21:29:36