web-dev-qa-db-fra.com

Éloquent: utilisation de find () et where () laravel

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?

21
Awa Melvine

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;
30
craig_h

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.

10
SlyDave