web-dev-qa-db-fra.com

D'abord ou créer

Je sais utiliser:

User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));

Vérifie si l'utilisateur existe en premier, sinon il le crée, mais comment vérifie-t-il? Vérifie-t-il tous les paramètres fournis ou existe-t-il un moyen de spécifier un paramètre spécifique, par exemple. puis-je simplement vérifier que l'adresse e-mail existe, et non le nom, car deux utilisateurs peuvent avoir le même nom mais leur adresse e-mail doit être unique.

54
panthro

firstOrCreate() vérifie la présence de tous les arguments avant finds une correspondance. Si tous les arguments ne correspondent pas, une nouvelle instance du modèle sera créée.

Si vous souhaitez uniquement vérifier un champ spécifique, utilisez firstOrCreate(['field_name' => 'value']) avec un seul élément du tableau. Cela renverra le premier élément qui correspond ou en créera un autre si aucune correspondance n'est trouvée.

La différence entre firstOrCreate() et firstOrNew():

  • firstOrCreate() créera automatiquement une nouvelle entrée dans la base de données si aucune correspondance n'est trouvée. Sinon, vous obtiendrez l'article correspondant.
  • firstOrNew() vous donnera une nouvelle instance de modèle à utiliser si aucune correspondance n'est trouvée, mais ne sera enregistrée dans la base de données que si vous le faites explicitement (en appelant save() sur le modèle). Sinon, vous obtiendrez l'article correspondant.

Le choix entre l'un ou l'autre dépend de ce que vous voulez faire. Si vous souhaitez modifier l'instance de modèle avant qu'elle ne soit enregistrée pour la première fois (par exemple, en définissant name ou un champ obligatoire), vous devez utiliser firstOrNew(). Si vous pouvez simplement utiliser les arguments pour créer immédiatement une nouvelle instance de modèle dans la base de données sans la modifier, vous pouvez utiliser firstOrCreate().

113
lowerends

La réponse précédente est obsolète. Il est possible de réaliser en une étape puisque Laravel 5.3, firstOrCreate a maintenant le deuxième paramètre values, utilisé pour le nouvel enregistrement, mais pas pour la recherche.

$user = User::firstOrCreate([
    'email' => '[email protected]'
], [
    'firstName' => 'Taylor',
    'lastName' => 'Otwell'
]);
48
umbrel

Une mise à jour:

À partir de Laravel 5.3, cela est possible en une seule étape; la méthode firstOrCreate accepte désormais un second tableau facultatif comme argument.

Le premier argument de tableau est le tableau sur lequel les champs/valeurs sont mis en correspondance, et le second tableau est les champs supplémentaires à utiliser lors de la création du modèle si aucune correspondance n'est trouvée via la correspondance des champs/valeurs du premier tableau:

Voir documentation

2
A_funs