J'essaie d'obtenir un enregistrement d'une table de base de données posts
à l'aide de son identifiant. Je me suis cogné la tête avec la méthode find () pendant un bon moment maintenant, confus quant à pourquoi cela ne fonctionnait pas. Voici ma requête qui me semble correcte mais qui n'a pas fonctionné:
$post = Post::find($id);
$post->delete();
À contrecœur, j'ai fait ceci:
$post = Post::where('id', $id);
$post->delete();
et assez étonnamment, cela a fonctionné mais je ne sais pas comment.
Je sais aussi que contrairement à find()
, where()
est un constructeur de requêtes et que je pourrais donc aussi l'utiliser comme ceci: Post::where('id', $id)->first()
Des idées sur la différence dans la façon dont les méthodes fonctionnent?
Votre code a l'air bien, mais il y a plusieurs choses à savoir:
Post::find($id);
agit sur la clé primaire, si vous avez défini votre clé primaire dans votre modèle sur autre chose que id
en procédant comme suit:
protected $primaryKey = 'slug';
alors find
recherchera plutôt avec cette clé.
Laravel s'attend également à ce que id
soit un entier. Si vous utilisez autre chose qu'un entier (tel qu'une chaîne), vous devez définir la propriété incrémentante de votre modèle sur false:
public $incrementing = false;
Pour ajouter au commentaire de craig_h ci-dessus (actuellement, je n'ai pas assez de représentants pour l'ajouter à sa réponse, désolé), si votre clé primaire n'est pas un entier, vous voudrez également indiquer à votre modèle le type de données à utiliser. est, en définissant keyType en haut de la définition du modèle.
public $keyType = 'string'
Eloquent comprend l’un des types définis dans la fonction castAttribute()
, qui à partir de Laravel 5.4 sont: int, float, string, bool, object, array, collection, date et horodatage.
Cela garantira que votre clé primaire est correctement convertie dans le type de données équivalent PHP.