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:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
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 modelo
e tentará encontrar entrada com
coluna shopId = $theID
e
coluna metadateKey = 2001
e se encontrar, atualizará a coluna shopOwner
da linha encontrada para New 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 sua id
coluna seja incrementada automaticamente.
Caso contrário, ele lançará um erro ao executar o exemplo acima:
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))'
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á é:
// 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]
);
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:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Obviamente, não esqueça de adicionar a fachada do DB:
use Illuminate\Support\Facades\DB;
OU
use DB;
Espero que ajude
shopId
não é sua chave primária, certo?