Lorsque vous tentez d'utiliser une chaîne personnalisée comme clé primaire pour une table Eloquent dans Laravel 5.2, la clé primaire la valeur clé peut étonnamment devenir 0. Ce comportement peut être déroutant et frustrant.
Voyons explorez le problème et trouvez une solution :
Vous disposez d'une table avec une clé primaire basée sur une chaîne et vous utilisez Eloquent pour interagir avec la base de données. Lorsque vous récupérez un enregistrement à l'aide de first() en fonction de la clé primaire, la valeur de la clé primaire devient 0 dans l'objet résultant.
Le problème réside dans le comportement par défaut de Laravel pour l'auto- incrémentation des clés primaires. Par défaut, Laravel suppose que la clé primaire est un entier. Lors de la récupération des attributs du modèle, il vérifie si la colonne correspondante doit être convertie en nombre entier. Puisque votre clé primaire est une chaîne, ce processus de conversion modifie la valeur à 0.
Pour résoudre ce problème, vous devez spécifier explicitement que votre clé primaire n'est pas auto-incrémentée et doit être traité comme une chaîne. Pour ce faire, ajoutez les lignes suivantes à votre classe de modèle Eloquent :
protected $primaryKey = 'your_key_name'; // Your primary key name public $incrementing = false; // Disable auto-incrementing
Pour Laravel 6.0 et supérieur :
En plus de ce qui précède, vous avez également besoin pour définir la propriété $keyType sur 'string' :
protected $keyType = 'string';
Avec ces paramètres, Laravel traitera correctement votre clé primaire comme une chaîne et évitez la conversion erronée en entier.
Horodatage :
Si votre table n'a pas d'horodatage, vous devez définir $ les horodatages sont définis sur false dans votre modèle pour éviter les problèmes liés aux horodatages définis sur '0000-00-00 00:00:00'.
$timestamps = false;
Exemple :
Voici un exemple mis à jour d'un modèle avec une clé primaire de chaîne à incrémentation non automatique :
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+ }
Avec ces changements, vous devriez désormais pouvoir travailler avec succès avec une clé primaire basée sur une chaîne dans Laravel 5.2 sans que la valeur de la clé primaire soit réinitialisée à 0.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!