2020 업데이트
마찬가지로 Laravel> = 5.3 , 누군가는 쉬운 방법으로 그 방법을 여전히 궁금합니다. 다음을 사용하여 가능합니다 updateOrCreate()
.
예를 들어 질문과 같은 경우 다음과 같은 것을 사용할 수 있습니다.
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
위의 코드는 ShopMeta로 표시되는 테이블을 확인하며, shop_metas
모델 자체에서 달리 정의하지 않는 한 가장 가능성이 높습니다
그리고 그것은 항목을 찾으려고 노력할 것입니다
기둥 shopId = $theID
과
기둥 metadateKey = 2001
찾은 경우 shopOwner
찾은 행의 열 을로 업데이트 합니다 New One
.
하나 이상의 일치하는 행을 찾으면 가장 낮은 기본 행을 의미하는 첫 번째 행을 업데이트합니다 id
.
전혀 찾지 못하면 다음과 같이 새 행을 삽입합니다.
shopId = $theID
, metadateKey = 2001
및shopOwner = New One
유의 사항 모델을 점검 $fillable
하고 삽입 또는 갱신 할 컬럼 이름을 정의하고 나머지 컬럼에 기본값 또는 id
컬럼 자동 증가 값이 있는지 확인하십시오 .
그렇지 않으면 위의 예제를 실행할 때 오류가 발생합니다.
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))'
새 행을 삽입하는 동안 값이 필요한 일부 필드가 있으므로 정의되지 않았 $fillable
거나 기본값 이 없으므로 불가능 합니다.
자세한 내용은 Laravel 설명서 ( https://laravel.com/docs/5.3/eloquent) 를 참조하십시오.
거기에서 하나의 예는 다음과 같습니다
// 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]
);
거의 모든 것을 지 웁니다.
쿼리 빌더 업데이트
누군가 라 라벨에서 Query Builder를 사용할 수 있는지 물었다. 다음 은 Laravel 문서의 Query Builder에 대한 참조입니다.
Query Builder는 Eloquent와 정확히 동일하게 작동하므로 Eloquent에 해당되는 것은 Query Builder에도 적용됩니다. 따라서이 특정 경우 쿼리 작성기와 동일한 기능을 다음과 같이 사용하십시오.
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
물론 DB 파사드를 추가하는 것을 잊지 마십시오.
use Illuminate\Support\Facades\DB;
또는
use DB;
나는 그것이 도움이되기를 바랍니다
shopId
당신의 기본 키가 아닌 것 같아요 ?