Qual é a forma abreviada de inserir um novo registro ou atualizar, se existir?
<?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ão é sua chave primária, certo?Respostas:
Aqui está um exemplo completo do que "lu cip" estava falando:
Abaixo está o link atualizado dos documentos que estão na versão mais recente do Laravel
Documentos aqui: link atualizado
fonte
Atualizado: 27 de agosto de 2014 - [
updateOrCreate
Criada no núcleo ...]Apenas para o caso de as pessoas ainda se depararem com isso ... descobri algumas semanas depois de escrever isso, que isso faz parte do núcleo do Eloquent do Laravel ...
Indo para o (s) método (s) equivalente (s) da Eloquent. Você pode ver aqui:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
em: 570 e: 553
Resposta antiga abaixo
Gostaria de saber se existe alguma funcionalidade L4 integrada para fazer isso de alguma forma, como:
Eu criei esse método algumas semanas atrás ...
Espero que ajude. Eu adoraria ver uma alternativa para isso, se alguém tiver um para compartilhar. @erikthedev_
fonte
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
deve fazê-lo.Atualização 2020
Como no Laravel> = 5.3 , se alguém ainda estiver curioso para fazê-lo de maneira fácil. Sua possível usando:
updateOrCreate()
.Por exemplo, para perguntas feitas, você pode usar algo como:
O código acima verificará a tabela representada pelo ShopMeta, que será mais provável, a
shop_metas
menos que não seja definido de outra forma no próprio modeloe tentará encontrar entrada com
coluna
shopId = $theID
e
coluna
metadateKey = 2001
e se encontrar, atualizará a coluna
shopOwner
da linha encontrada paraNew One
.Se encontrar mais de uma linha correspondente, atualizará a primeira linha, o que significa qual é a menor primária
id
.Se não for encontrado, ele inserirá uma nova linha com:
shopId = $theID
,metadateKey = 2001
eshopOwner = New One
Aviso Verifique seu modelo
$fillable
e suponha que você tenha todos os nomes de colunas definidos lá, nos quais deseja inserir ou atualizar e que as colunas restantes tenham valor padrão ou suaid
coluna seja incrementada automaticamente.Caso contrário, ele lançará um erro ao executar o exemplo acima:
Como haveria algum campo que precisará de valor ao inserir uma nova linha e isso não será possível, pois não está definido
$fillable
ou não possui valor padrão.Para obter mais referências, consulte a documentação do Laravel em: https://laravel.com/docs/5.3/eloquent
Um exemplo de lá é:
o que praticamente limpa tudo.
Atualização do Query Builder
Alguém perguntou se é possível usar o Query Builder no Laravel. Aqui está uma referência para o Query Builder dos documentos do Laravel.
O Query Builder funciona exatamente da mesma forma que o Eloquent, portanto, qualquer coisa verdadeira para o Eloquent também é verdadeira para o Query Builder. Portanto, neste caso específico, use a mesma função com o construtor de consultas da seguinte maneira:
Obviamente, não esqueça de adicionar a fachada do DB:
OU
Espero que ajude
fonte
Salvar função:
já faz o que você quer ...
Código Laravel:
fonte
firstOrNew
criará um registro se não existir e atualizará uma linha se já existir. Você também pode usarupdateOrCreate
aqui é o exemplo completoSe houver um voo de Oakland para San Diego, defina o preço para US $ 99. se não existir, crie uma nova linha
Documento de referência aqui: ( https://laravel.com/docs/5.5/eloquent )
fonte
Se você precisar da mesma funcionalidade usando o
DB
, no Laravel,>= 5.5
poderá usar:ou a versão abreviada quando
$attributes
e$values
são os mesmos:fonte
Em seguida, faça as alterações e salve. Observe que o firstOrNew não faz a inserção se não for encontrado; se você precisar, o firstOrCreate.
fonte
Mais uma opção se o seu ID não for incremento automático e você souber qual inserir / atualizar:
fonte
Como o método firstOrCreate, updateOrCreate persiste no modelo, portanto não há necessidade de chamar save ()
E para o seu problema
fonte
Na verdade, firstOrCreate não seria atualizado caso o registro já exista no banco de dados. Melhorei um pouco a solução de Erik, pois precisava atualizar uma tabela que tivesse valores exclusivos, não apenas para a coluna "id"
Então você usaria assim:
fonte
como @JuanchoRamone postado acima (obrigado @Juancho), é muito útil para mim, mas se seus dados forem array, você deve modificar um pouco assim:
fonte
https://github.com/yadakhov/insert-on-duplicate-key
fonte
verifique se um usuário existe ou não. Caso contrário, insira
fonte