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:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
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ême
et 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:
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 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:
// 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 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:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Bien sûr, n'oubliez pas d'ajouter une façade DB:
use Illuminate\Support\Facades\DB;
OU
use DB;
J'espère que ça aide
shopId
n'est pas votre clé primaire, non?