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
デフォルト値がないため不可能です。
詳細については、https://laravel.com/docs/5.3/eloquentにあるLaravelのドキュメントを参照してください
。
そこからの一例は:
// 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]
);
すべてをほぼクリアにします。
クエリビルダーの更新
誰かがLaravelのQuery Builderを使用して可能かどうか尋ねました。これは、Laravel docsからのクエリビルダーのリファレンスです。
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
あなたの主キーではないと思いますよね?