web-dev-qa-db-fra.com

Laravel 5.2 - Utiliser une chaîne en tant que clé primaire personnalisée pour la table Eloquent devient 0

J'essaie d'utiliser le courrier électronique comme clé primaire de ma table, alors mon code éloquent est-

<?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';
}

Et mon DB est comme ça-

enter image description here

mais si je fais ça-

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

Je reçois ceci-

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

Ainsi, le jeton de vérification / (0) devient la clé primaire .

Quelqu'un peut-il aider s'il vous plait?

59
Abrar Jahin

C'était ajouté à la documentation de la mise à niveau le 29 décembre 2015 , donc si vous avez effectué une mise à niveau avant, vous l'avez probablement manquée.

Lors de l'extraction d'un attribut du modèle, il vérifie si cette colonne doit être convertie en entier, chaîne, etc.

Par défaut, pour les tables auto-incrémentées, l'ID est supposé être un entier dans cette méthode:

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

La solution est donc:

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

    public $incrementing = false;
}
135
andrewtweber

Sur le modèle, définissez $incrementing sur false

public $incrementing = false;

Cela l'empêchera de penser qu'il s'agit d'un champ à incrémentation automatique.

Laravel Docs - Eloquent - Définition de modèles

21
lagbox

Il y a deux propriétés sur le modèle que vous devez définir. Le premier $primaryKey indique au modèle la colonne sur laquelle la clé primaire doit être attendue. Le second $incrementing pour qu'il sache que la clé primaire n'est pas une valeur d'incrémentation automatique linéaire.

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

    public $incrementing = false;
}

Pour plus d'informations, voir la section Primary Keys dans documentation sur Eloquent .

7
Wader

J'utilisais Postman pour tester mon API Laravel.

J'ai reçu une erreur qui dit

"SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue" car Laravel tentait de créer automatiquement deux colonnes "created_at" et "updated_at".

Je devais entrer public $timestamps = false; dans mon modèle. Ensuite, j'ai de nouveau testé avec Postman et constaté qu'une variable "id" = 0 était en cours de création dans ma base de données.

J'ai finalement dû ajouter public $incrementing false; pour réparer mon API.

2
Erich Meissner

continue à utiliser l'identifiant


<?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';
}

et recevez l'email:

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