私は最近 Laravel と Eloquent で作業を開始しましたが、モデルの検索オプションまたは作成オプションの欠如について疑問を抱いていました。たとえば、次のように書くことができます。
$user = User::find($id);
if (!$user) {
$user = new User;
}
ただし、検索または作成するより良い方法はありませんか?例では簡単に思えますが、より複雑な状況では、既存のレコードを取得して更新するか、新しいレコードを作成することが非常に役立ちます。
以下は、最初に受け入れられた回答です。 laravel-4
findOrFail
には既にメソッドLaravel
があり、このメソッドを使用すると失敗するとModelNotFoundException
がスローされますが、モデルにメソッドを作成することで実行できます、たとえば、User
モデルがある場合、この関数をモデルに入れるだけです
_// Put this in any model and use
// Modelname::findOrCreate($id);
public static function findOrCreate($id)
{
$obj = static::find($id);
return $obj ?: new static;
}
_
コントローラーから、次を使用できます
_$user = User::findOrCreate(5);
$user->first_name = 'Jhon';
$user->last_name = 'Doe';
$user->save();
_
id
od _5
_]を持つユーザーがexixtsの場合、更新されます。そうでない場合、新しいユーザーが作成されますが、id
は_last_user_id + 1
_(自動インクリメント)である。
これは同じことを行う別の方法です。
_public function scopeFindOrCreate($query, $id)
{
$obj = $query->find($id);
return $obj ?: new static;
}
_
静的メソッドを作成する代わりに、モデルでscope
を使用できるため、Model
のメソッドはscopeMethodName
になり、Model::methodName()
を呼び出します。静的メソッドで行ったように、たとえば
_$user = User::findOrCreate(5);
_
firstOrCreate
は_Laravel 5x
_で利用できます。答えは古すぎて、_Laravel-4.0
_の_2013
_に与えられました。
Laravel 5.3では、firstOrCreate
メソッドには次の宣言があります。
_public function firstOrCreate(array $attributes, array $values = [])
_
つまり、次のように使用できます。
_User::firstOrCreate(['email' => $email], ['name' => $name]);
_
ユーザーの存在はメールでのみ確認されますが、作成されると、新しいレコードはメールと名前の両方を保存します。
または、この場合、Laravelの関数を使用して、属性としてidを検索することもできます。
$user = User::firstOrCreate(['id' => $id]);
Laravel 4モデルには、必要なことを行う組み込みの findOrNew
メソッドがあります。
$user = User::findOrNew($id);
In Laravel 5:
属性を一括で割り当ててモデルを作成するために使用できる方法は、firstOrCreate
とfirstOrNew
の2つです。firstOrCreate
メソッドは、指定された列/値のペアを使用してデータベースレコードを見つけようとします。データベースでモデルが見つからない場合、レコードは指定された属性で挿入になります。
_firstOrNew
などのfirstOrCreate
メソッドは、指定された属性に一致するデータベース内のレコードを見つけようとします。ただし、モデルが見つからない場合、新しいモデルインスタンスが返されます。 firstOrNew
によって返されるモデルはまだデータベースに永続化されていないことに注意してください。保存するには、手動でsaveを呼び出す必要があります。
// Retrieve the flight by the attributes, or create it if it doesn't exist...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// Retrieve the flight by the attributes, or instantiate a new instance...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
主キーに基づいて検索または新規id
$user = User::findOrNew($id); // if exist then update else insert
$user->name= $data['full_name'];
$user->save();
非主キーに基づく最初または新規単一ファイル
// get the record where field_name=value else insert new record
$user = User::firstOrNew(['field_name'=>'value']);
$user->name= $data['full_name'];
$user->save();
非プライマリキーに基づく最初または新規複数ファイル
// get the record where field_name1=value1 and field_name2=value2, else insert new record
$user = User::firstOrNew(['field_name1'=>'value1','field_name2'=>'value2']);
$user->name= $data['full_name'];
$user->save();
FirstOrCreateを使用できます(Laravel 4.2で動作します)
$bucketUser = BucketUser::firstOrCreate([
'bucket_id' => '1',
'user_id' => '2',
]);
見つかったインスタンスまたは新しいインスタンスを返します。