Heim >Datenbank >MySQL-Tutorial >Warum wird der String-Primärschlüssel meines Laravel 5.2 Eloquent-Modells zu 0?

Warum wird der String-Primärschlüssel meines Laravel 5.2 Eloquent-Modells zu 0?

Susan Sarandon
Susan SarandonOriginal
2024-11-22 02:25:15494Durchsuche

Why Does My Laravel 5.2 Eloquent Model's String Primary Key Become 0?

Laravel 5.2: Primärschlüsselverlust bei Verwendung einer Zeichenfolge beheben

Beim Versuch, eine benutzerdefinierte Zeichenfolge als Primärschlüssel für eine Eloquent-Tabelle in Laravel 5.2 zu verwenden, wird die primäre Der Schlüsselwert könnte überraschenderweise auf 0 fallen. Dieses Verhalten kann rätselhaft sein und frustrierend.

Lassen Sie uns in das Problem eintauchen und eine Lösung finden:

Problembeschreibung

Sie haben eine Tabelle mit einem stringbasierten Primärschlüssel und verwenden Eloquent um mit der Datenbank zu interagieren. Wenn Sie einen Datensatz mithilfe von first() basierend auf dem Primärschlüssel abrufen, wird der Primärschlüsselwert im resultierenden Objekt zu 0.

Ursache

Das Problem liegt im Standardverhalten von Laravel für automatische Inkrementieren von Primärschlüsseln. Standardmäßig geht Laravel davon aus, dass der Primärschlüssel eine Ganzzahl ist. Beim Abrufen von Attributen aus dem Modell wird geprüft, ob die entsprechende Spalte in eine Ganzzahl umgewandelt werden soll. Da Ihr Primärschlüssel eine Zeichenfolge ist, ändert dieser Umwandlungsprozess den Wert in 0.

Lösung

Um dieses Problem zu beheben, müssen Sie explizit angeben, dass Ihr Primärschlüssel nicht automatisch inkrementiert wird und sollte als String behandelt werden. Fügen Sie dazu die folgenden Zeilen zu Ihrer Eloquent-Modellklasse hinzu:

protected $primaryKey = 'your_key_name';  // Your primary key name
public $incrementing = false;  // Disable auto-incrementing

Für Laravel 6.0 und höher:

Zusätzlich zu den oben genannten benötigen Sie auch So setzen Sie die $keyType-Eigenschaft auf „string“:

protected $keyType = 'string';

Mit diesen Einstellungen behandelt Laravel Ihren Primärschlüssel korrekt als String und verhindern Sie die fehlerhafte Umwandlung in eine Ganzzahl.

Zusätzliche Überlegungen

Zeitstempel:

Wenn Ihre Tabelle keine Zeitstempel hat, sollten Sie $timestamps festlegen in Ihrem Modell auf „false“ setzen, um Probleme mit der Einstellung von Zeitstempeln auf „0000-00-00“ zu vermeiden 00:00:00'.

$timestamps = false;

Beispiel:

Hier ist ein aktualisiertes Beispiel eines Modells mit einem nicht automatisch inkrementierenden String-Primärschlüssel:

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable = ['email', 'verification_token'];
    //$timestamps = false;  // If your table doesn't have timestamps
    protected $primaryKey = 'verification_token';
    public $incrementing = false;
    protected $keyType = 'string';  // For Laravel 6.0+
}

Mit diesen Änderungen sollten Sie nun in der Lage sein, in Laravel 5.2 erfolgreich mit einem stringbasierten Primärschlüssel zu arbeiten ohne dass der Primärschlüsselwert auf 0 zurückgesetzt wird.

Das obige ist der detaillierte Inhalt vonWarum wird der String-Primärschlüssel meines Laravel 5.2 Eloquent-Modells zu 0?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn