Mise à jour 2020
Comme dans Laravel >= 5.3 Si quelqu'un est toujours curieux de savoir comment le faire facilement, il peut le faire en utilisant le système de gestion de l'information : updateOrCreate()
.
Par exemple pour la question posée vous pouvez utiliser quelque chose comme :
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Le code ci-dessus vérifiera la table représentée par ShopMeta, qui sera très probablement shop_metas
sauf s'il n'est pas défini autrement dans le modèle lui-même.
Et il essaiera de trouver une entrée avec
colonne shopId = $theID
et
colonne metadateKey = 2001
et s'il le trouve, il mettra à jour la colonne shopOwner
de la ligne trouvée à New One
.
S'il trouve plus d'une ligne correspondante, il mettra à jour la toute première ligne, c'est-à-dire celle qui a la plus petite valeur primaire. id
.
Si elle n'est pas trouvée, une nouvelle ligne sera insérée avec le code :
shopId = $theID
, metadateKey = 2001
y shopOwner = New One
Avis Vérifiez votre modèle pour $fillable
et assurez-vous que vous avez défini chaque nom de colonne que vous voulez insérer ou mettre à jour et que les autres colonnes ont soit une valeur par défaut, soit sa valeur de base. id
colonne auto incrémentée de un.
Sinon, il y aura une erreur lors de l'exécution de l'exemple ci-dessus :
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))'
Comme il y aurait un champ qui aurait besoin d'une valeur lors de l'insertion d'une nouvelle ligne et que cela ne serait pas possible, soit parce qu'il n'est pas défini dans la base de données de l'utilisateur. $fillable
ou il n'a pas de valeur par défaut.
Pour plus de références, veuillez consulter la documentation de Laravel à l'adresse suivante : https://laravel.com/docs/5.3/eloquent
En voici un exemple :
// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
ce qui efface à peu près tout.
Mise à jour de Query Builder
Quelqu'un a demandé s'il était possible d'utiliser Query Builder dans Laravel. Ici est la référence pour Query Builder dans la documentation de Laravel.
Query Builder fonctionne exactement de la même manière qu'Eloquent, donc tout ce qui est vrai pour Eloquent l'est également pour Query Builder. Donc pour ce cas spécifique, utilisez la même fonction avec votre query builder comme ceci :
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Bien sûr, n'oubliez pas d'ajouter la façade DB :
use Illuminate\Support\Facades\DB;
OU
use DB;