Heim >PHP-Framework >Laravel >Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

藏色散人
藏色散人nach vorne
2020-04-20 11:53:203053Durchsuche

Vorgeschichte

Vor kurzem wurde das Back-End-Projekt des Unternehmens von der vorherigen Version laravel5.6 auf die Version laravel5.8 aktualisiert. Nach dem Upgrade generierte das System eine viel SQL-Ausführung Es war falsch, aber es lief gut in der alten Version des Systems, so dass die heutige Reise des Lochgrabens geboren wurde.

Empfohlen: "Laravel-Tutorial"

Projektumgebung

Altes System (Linux + Laravel5.6 + PHP7.2 + mysql5.7)

Das aktualisierte neue System (Linux +laravel5.8 + php7.2 + mysql5.7)

Es wurde nur die Laravel-Framework-Version aktualisiert und andere verwandte Dienste nicht aktualisiert Abhängigkeit.

Aber es ist eine große Anzahl von SQL-Ausführungsfehlern aufgetreten. Die Ausnahmeüberwachung ist wie folgt:

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Analyseprozess

Was den Fehler in diesem Dienst verursacht hat, ist ein solches Stück Geschäftslogik, das durch eine Demo unten simuliert wird

$pivot = UserRole::firstOrCreate([
    'user_id' => 3,
    'role_id' => 3,
]);
$this->addRoleHistory($user,$pivot->id);
dd($pivot->id);

In der Laravel 5.6-Version läuft dieser Code problemlos, wird es aber nicht Nach dem Upgrade auf Version 5.8 wurde eine große Anzahl von SQL-Ausführungsfehlern verursacht, wie die folgenden.

laravel5.6:
    dd($pivot->id); //10002
laravel5.8:
    dd($pivot->id); //null

Die ID konnte normal aus den in 5.6 gespeicherten Daten abgerufen werden, aber warum funktionierte das nicht? 5.8, also habe ich sofort laravel5.8 überprüft. Den Versionshinweisen zufolge wurde keine Änderung gefunden, die den Erwerb der Auto-Inkrement-ID für das Pivot-Modell abbricht, also begann ich, den 5.8-Quellcode zu überprüfen. . .

Zuerst verglichen wir die firstOrCreate-Funktion von 5.6 und 5.8 und stellten fest, dass es keine Änderungen gab und die Codelogik korrekt ausgeführt wurde.

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Lesen Sie dann weiter den Code der Funktion model->save()

und stellen Sie fest, dass die nicht vorhandenen Daten über insertAndSetId eingefügt werden Funktion und der Primärschlüssel ist die festgelegte ID

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Aber die insertAndSetId-Funktion wird durch ein Mitgliedsattribut wie Inkrementierung gesteuert. Der Standardwert des Attributs ist true

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Wenn dieses Attribut geändert wird, wird der nächste Schritt ausgeführt. Wurde dieses Mitgliedsattribut manipuliert?

Also habe ich sofort den Quellcode des Pivot-Modells von 5.8 überprüft

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Schließlich habe ich festgestellt, dass in 5.8 die Inkrementierung standardmäßig auf „false“ eingestellt ist Tabelle Pivot-Klasse, also Die Daten wurden erfolgreich eingefügt, aber die Primärschlüssel-ID nach dem Einfügen wurde nicht festgelegt, was dazu führte, dass die verbleibenden Dienste abstürzten und nicht normal ausgeführt wurden...

Reparaturplan

Überschreiben Sie in jedem Pivot einfach den inkrementierenden Attributwert in der Klasse erneut mit „true“.

class UserRole extends Pivot
{
    public $incrementing = true;
    protected $fillable = [
        'user_id',
        'role_id',
    ];
}

Nach der Reparatur:

laravel5.8:
    dd($pivot->id); //10003

Postscript

Also habe ich es mir noch einmal genau angesehen. In den Versionshinweisen zu laravel5.7~laravel5.8 stellte ich fest, dass der Grund für diese Änderung immer noch nicht erwähnt wurde, also ging ich erneut zu Google und konnte den Grund dafür immer noch nicht finden meme.

Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)

Am Ende wurden die durch diese Änderung verursachten Probleme erfolgreich behoben und es erinnerte uns auch daran, dass wir der UT-Abdeckung und Versionskompatibilität noch mehr Aufmerksamkeit schenken müssen Änderungstests bei nachfolgenden Versions-Upgrades, um die Projektqualität in mehreren Dimensionen sicherzustellen.

Das obige ist der detaillierte Inhalt vonVerschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen