Heim >PHP-Framework >Laravel >Verschwundene Pivot-Modell-ID (Laravel-Fall-Tagebuch)
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:
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.
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
Aber die insertAndSetId-Funktion wird durch ein Mitgliedsattribut wie Inkrementierung gesteuert. Der Standardwert des Attributs ist true
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
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.
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!