Laravel-Datenbankschema, Nullable Foreign

Lesezeit: 5 Minuten

Benutzer-Avatar
UnsinnKreativität

Ich habe diese beiden Datenbanktabellen:

  1. Benutzertabellen
  2. Partnertabellen

Benutzertabellen behandelt diese Art von Informationen

Schema::create('users', function (Blueprint $table) {
      $table->increments('id')->unique();
      $table->string('email')->unique();
      $table->string('username')->unique();
      $table->string('password', 60);
      $table->string('photo')->nullable();
      $table->integer('partner_id')->unsigned();
      $table->foreign('partner_id')->references('id')->on('partners');
      $table->rememberToken();
      $table->timestamps();
});

Während Partnertabellen enthält alle Benutzer-Metainformationen wie Vorname und Nachname usw.

Schema::create('partners', function (Blueprint $table) {

    /**
     * Identity Columns
     */
    $table->increments('id')->unique();
    $table->string('first_name');
    $table->string('middle_name')->nullable();
    $table->string('last_name')->nullable();
    $table->string('display_name')->nullable();
    $table->string('email')->unique()->nullable();
    $table->string('website')->nullable();
    $table->string('phone')->nullable();
    $table->string('mobile')->nullable();
    $table->string('fax')->nullable();
    $table->date('birthdate')->nullable();
    $table->longText('bio')->nullable();
    $table->string('lang')->nullable(); //Language

    /**
     * Address Columns
     */
    $table->text('street')->nullable();
    $table->text('street2')->nullable();
    $table->integer('country_id')->unsigned(); // foreign
    $table->foreign('country_id')->references('id')->on('countries');
    $table->integer('state_id')->unsigned();   // foreign
    $table->foreign('state_id')->references('id')->on('country_states');
    $table->string('city')->nullable();
    $table->string('district')->nullable();
    $table->string('area')->nullable();
    $table->string('zip')->nullable();
});

Wenn sich ein Benutzer auf der Website registriert, möchte ich nur wenige Felder, die username, email address, password, first name und last name. Dies sind nur die Pflichtfelder.

So können Informationen in Partnertabellen später ausgefüllt werden, nachdem der Benutzer die Registrierung auf der Website abgeschlossen hat.

Aber aufgrund der Struktur des Fremdschlüssels kann ich wegen dieses Fehlers nicht weitermachen:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`mytable`.`tbl_partners`, CONSTRAINT `partners_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `tbl_countries` (`id`)) (SQL: insert into `tbl_partners` (`first_name`, `last_name`, `display_name`, `email`, `updated_at`, `created_at`) values (Jack, Wilson, admin, [email protected], 2016-06-09 19:41:18, 2016-06-09 19:41:18))

Ich weiß, dass dies an der Ländertabelle liegt, die von der Partnertabelle benötigt wird.
Meine Frage ist: Gibt es eine Problemumgehung, damit ich das Land oder andere nicht erforderliche Daten in der Partnertabelle ausfüllen, aber das ausländische Tabellenschema für Länder, Bundesstaaten usw. beibehalten kann?

Damit Laravel 7.x einen Nullable-Fremdschlüssel erstellt, verwenden Sie einfach:

$table->foreignId('country_id')->nullable()->constrained();

$table->foreignId('state_id')->nullable()->constrained();

DENKEN SIE DARAN: nullable sollte sein Vor eingeschränkt andernfalls wird die Nullable nicht beeinflusst.

  • In der Tat ein eigenartiges Verhalten. Mich interessiert auch warum nullable() sollte zuerst kommen.

    – Propagandisten

    17. Juni 2020 um 9:31 Uhr

  • Ich habe eine Stunde Arbeit verschwendet, weil ich nicht wusste, dass nullable vor der Einschränkung geschrieben werden muss.

    – Ivandez

    5. Juli 2021 um 22:05 Uhr

  • Aber warum sollte nullable() kommt zuerst ?

    – Eyad Mohammed Osama

    14. September 2021 um 14:11 Uhr

  • Es sollte an erster Stelle stehen, denn so wird es umgesetzt. Wenn Sie logisch darüber nachdenken, wenn Sie versuchen, einzuschränken und DANN nullable zu sagen, ist es wie der Versuch, der Kugel in den Weg zu kommen, sie wird abgefeuert, DANN ziehen Sie die Kevlar-Weste an.

    – sierflibble

    28. Februar um 17:42 Uhr

  • Es funktioniert nicht für Laravel 9 foreignIdFor()->nullable(), es ist sowieso NICHT NULL. Irgendwelche Ideen, wie man es null macht?

    – Pathos

    22. August um 21:25 Uhr

Stellen Sie die ein country_id und die state_id nullable, so.

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

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

  • Wenn Sie das Feld nullable nach dem Erstellen des Schemas ändern müssen, sollte die Zeile $table->integer(‘country_id’)->nullable()->unsigned()->change();

    – sh6210

    22. Mai 2017 um 10:26 Uhr


  • Wie definiere ich die Beziehung für a nullable()->unsigned() aufstellen? Auch das ist $table->foreign('country_id')->references('id')->on('countries') erforderlich?

    – Astronom

    19. April 2020 um 17:31 Uhr


Mit der neuesten Version von Laravel können Sie die verwenden nullable Methode in Verbindung mit foreignKey:

$table
      ->foreignId('other_table_id')
      ->nullable() // here
      ->references('id')
      ->on('other_table');

  • Wie füge ich hinzu, ob diese fremde ID in der übergeordneten Tabelle uuid ist?

    – Theodorie

    12. März 2021 um 9:34 Uhr

  • @theodory sowas wie: $table->foreignUuid('business_id')->nullable()->references('id')->on('businesses')->onDelete('cascade')->onUpdate('cascade');

    – Elly Post

    29. März 2021 um 18:46 Uhr


Für Laravel 7.x verwende ich diesen Weg:

$table->bigInteger('word_type_id')->nullable()->unsigned();
$table->index('word_type_id')->nullable();
$table->foreign('word_type_id')->nullable()->references('id')->on('word_types')->onDelete('cascade');

Laravel 8

$table->foreignId('foreign_key_id')->nullable()->constrained()->onDelete('cascade');

  • Funktioniert gut in Laravel 9: $table->foreignIdFor(\App\Models\Catalogs\Projects\Type::class,'projecttype_id')->nullable()->comment('Project type')->index('projecttype_foreign')->constrained(\App\Models\Catalogs\Projects\Type::make()->getTable());. Jeder Modifikator sollte vor dem stehen constrained() Methode. Andernfalls werden sie ignoriert.

    – Pathos

    23. August um 21:43 Uhr


Benutzer-Avatar
ThurstonLevi

Beachten Sie, dass Sie, wenn Sie reference(‘{column}’)->on(‘{table}’) haben, nullable()->constrained() davor setzen müssen, dh:

$table->foreignId('author')->nullable()->constrained()->references('id')->on('users');

Dies ist auf Laravel 9, aber wahrscheinlich auch früher.

  • Funktioniert gut in Laravel 9: $table->foreignIdFor(\App\Models\Catalogs\Projects\Type::class,'projecttype_id')->nullable()->comment('Project type')->index('projecttype_foreign')->constrained(\App\Models\Catalogs\Projects\Type::make()->getTable());. Jeder Modifikator sollte vor dem stehen constrained() Methode. Andernfalls werden sie ignoriert.

    – Pathos

    23. August um 21:43 Uhr


1334700cookie-checkLaravel-Datenbankschema, Nullable Foreign

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy