Quel est le raccourci pour insérer un nouvel enregistrement ou mettre à jour s'il existe?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
shopId
n'est pas votre clé primaire, non?Réponses:
Voici un exemple complet de ce dont parlait "lu cip":
Vous trouverez ci-dessous le lien mis à jour de la documentation sur la dernière version de Laravel
Documents ici: lien mis à jour
la source
Mise à jour: 27 août 2014 - [
updateOrCreate
Built into core ...]Juste au cas où les gens rencontreraient encore ceci ... J'ai découvert quelques semaines après avoir écrit ceci, que cela fait en fait partie du noyau d'Eloquent de Laravel ...
Explorer la (les) méthode (s) équivalente (s) d'Eloquent. Vous pouvez voir ici:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
sur: 570 et: 553
Ancienne réponse ci-dessous
Je me demande s'il existe une fonctionnalité L4 intégrée pour faire cela d'une manière quelconque, telle que:
J'ai créé cette méthode il y a quelques semaines ...
J'espère que cela aide. J'adorerais voir une alternative à cela si quelqu'un en a une à partager. @erikthedev_
la source
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
devrait le faire.Mise à jour 2020
Comme dans Laravel> = 5.3 , si quelqu'un est toujours curieux de savoir comment le faire de manière simple. C'est possible en utilisant:
updateOrCreate()
.Par exemple, pour une question posée, vous pouvez utiliser quelque chose comme:
Le code ci-dessus vérifiera la table représentée par ShopMeta, ce qui sera le plus probable,
shop_metas
sauf indication contraire dans le modèle lui-mêmeet il essaiera de trouver l'entrée avec
colonne
shopId = $theID
et
colonne
metadateKey = 2001
et s'il trouve, il mettra à jour la colonne
shopOwner
de la ligne trouvée pourNew One
.S'il trouve plus d'une ligne correspondante, il mettra à jour la toute première ligne qui signifie qui a le plus bas primaire
id
.S'il n'est pas du tout trouvé, il insérera une nouvelle ligne avec:
shopId = $theID
,metadateKey = 2001
etshopOwner = New One
Remarque Vérifiez votre modèle
$fillable
et assurez-vous que vous avez défini chaque nom de colonne que vous souhaitez insérer ou mettre à jour et que les colonnes de repos ont soit la valeur par défaut, soit said
colonne incrémentée automatiquement.Sinon, cela générera une erreur lors de l'exécution de l'exemple ci-dessus:
Comme il y aurait un champ qui aura besoin de valeur lors de l'insertion d'une nouvelle ligne et cela ne sera pas possible car
$fillable
il n'est pas défini dans ou il n'a pas de valeur par défaut.Pour plus de références, veuillez consulter la documentation Laravel sur: https://laravel.com/docs/5.3/eloquent
Un exemple à partir de là est:
ce qui efface à peu près tout.
Mise à jour du générateur de requêtes
Quelqu'un a demandé s'il était possible d'utiliser Query Builder dans Laravel. Voici la référence pour Query Builder de la documentation Laravel.
Query Builder fonctionne exactement de la même manière que Eloquent, donc tout ce qui est vrai pour Eloquent l'est également pour Query Builder. Donc, pour ce cas spécifique, utilisez simplement la même fonction avec votre générateur de requêtes comme ceci:
Bien sûr, n'oubliez pas d'ajouter une façade DB:
OU
J'espère que ça aide
la source
Fonction de sauvegarde:
fais déjà ce que tu veux ...
Code Laravel:
la source
firstOrNew
créera un enregistrement s'il n'existe pas et met à jour une ligne si elle existe déjà. Vous pouvez également utiliserupdateOrCreate
ici est l'exemple completS'il y a un vol d'Oakland à San Diego, fixez le prix à 99 $. s'il n'existe pas créer une nouvelle ligne
Doc de référence ici: ( https://laravel.com/docs/5.5/eloquent )
la source
Si vous avez besoin des mêmes fonctionnalités en utilisant
DB
, dans Laravel,>= 5.5
vous pouvez utiliser:ou la version abrégée quand
$attributes
et$values
sont les mêmes:la source
Effectuez ensuite vos modifications et enregistrez-les. Notez que firstOrNew ne fait pas l'insertion s'il n'est pas trouvé, si vous en avez besoin, alors son firstOrCreate.
la source
Une option de plus si votre identifiant n'est pas auto-incrémenté et que vous savez lequel insérer / mettre à jour:
la source
Comme la méthode firstOrCreate, updateOrCreate persiste le modèle, il n'est donc pas nécessaire d'appeler save ()
Et pour votre problème
la source
En fait, firstOrCreate ne serait pas mis à jour au cas où le registre existe déjà dans la base de données. J'ai amélioré un peu la solution d'Erik car j'avais en fait besoin de mettre à jour une table qui a des valeurs uniques non seulement pour la colonne "id"
Ensuite, vous l'utiliseriez comme ceci:
la source
comme @JuanchoRamone posté ci-dessus (merci @Juancho) c'est très utile pour moi, mais si vos données sont un tableau, vous devriez modifier un peu comme ceci:
la source
https://github.com/yadakhov/insert-on-duplicate-key
la source
vérifier si un utilisateur existe ou non. Sinon insérer
la source