web-dev-qa-db-de.com

Laravel 5.2 - Verwenden Sie eine Zeichenfolge als benutzerdefinierten Primärschlüssel für die Eloquent-Tabelle. Die Zeichenfolge wird zu 0

Ich versuche, E-Mail als Primärschlüssel für meine Tabelle zu verwenden, daher lautet mein beredter Code:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                                'email',
                                'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

Und meine DB ist so-

enter image description here

aber wenn ich das tue-

UserVerification::where('verification_token', $token)->first();

Ich verstehe das-

{
  "email": "[email protected]",
  "verification_token": 0,
  "created_at": "2016-01-03 22:27:44",
  "updated_at": "2016-01-03 22:27:44"
}

Daher wird der Verifizierungstoken / Primärschlüssel zu 0.

Kann jemand bitte helfen?

59
Abrar Jahin

Dies war hinzugefügt zu der Upgrade-Dokumentation am 29. Dezember 2015 . Wenn Sie also zuvor ein Upgrade durchgeführt haben, haben Sie es wahrscheinlich verpasst.

Beim Abrufen eines Attributs aus dem Modell wird überprüft, ob diese Spalte als Ganzzahl, Zeichenfolge usw. umgewandelt werden soll.

Standardmäßig wird für automatisch inkrementierende Tabellen angenommen, dass die ID in dieser Methode eine Ganzzahl ist:

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L279

Die Lösung lautet also:

class UserVerification extends Model
{
    protected $primaryKey = 'your_key_name'; // or null

    public $incrementing = false;
}
135
andrewtweber

Auf dem Modellsatz $incrementing auf false

public $incrementing = false;

Dies verhindert, dass es sich um ein Auto-Inkrement-Feld handelt.

Laravel Docs - Eloquent - Definieren von Modellen

21
lagbox

Es gibt zwei Eigenschaften für das Modell, die Sie festlegen müssen. Der Erste $primaryKey, um dem Modell mitzuteilen, für welche Spalte der Primärschlüssel erwartet werden soll. Der Zweite $incrementing Der Primärschlüssel ist also kein linearer Wert für die automatische Inkrementierung.

class MyModel extends Model
{
    protected $primaryKey = 'my_column';

    public $incrementing = false;
}

Weitere Informationen finden Sie in der Primary Keys Abschnitt in der Dokumentation zu Eloquent .

7
Wader

Ich habe Postman verwendet, um meine Laravel API zu testen.

Ich habe einen angegebenen Fehler erhalten

"SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte", da Laravel versuchte, automatisch zwei Spalten "created_at" und "updated_at" zu erstellen.

Ich musste public $timestamps = false; In mein Modell eingeben. Dann habe ich erneut mit Postman getestet und festgestellt, dass eine "id" = 0 - Variable in meiner Datenbank erstellt wurde.

Ich musste schließlich public $incrementing false; Hinzufügen, um meine API zu reparieren.

2
Erich Meissner

benutze weiterhin die ID


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                            'id',
                            'email',
                            'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

und bekomme die email:

    $usr = User::find($id);
    $token = $usr->verification_token;
    $email = UserVerification::find($token);
1
Zμ 1