web-dev-qa-db-ja.com

Eloquentで検索または作成

私は最近 LaravelEloquent で作業を開始しましたが、モデルの検索オプションまたは作成オプションの欠如について疑問を抱いていました。たとえば、次のように書くことができます。

$user = User::find($id);
if (!$user) {
    $user = new User;
}

ただし、検索または作成するより良い方法はありませんか?例では簡単に思えますが、より複雑な状況では、既存のレコードを取得して更新するか、新しいレコードを作成することが非常に役立ちます。

26
charleyh

以下は、最初に受け入れられた回答です。 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]);
_

ユーザーの存在はメールでのみ確認されますが、作成されると、新しいレコードはメールと名前の両方を保存します。

APIドキュメント

56
The Alpha

または、この場合、Laravelの関数を使用して、属性としてidを検索することもできます。

$user = User::firstOrCreate(['id' => $id]);
27
Oliver Adria

Laravel 4モデルには、必要なことを行う組み込みの findOrNew メソッドがあります。

$user = User::findOrNew($id);
10
Peter Gluck

In Laravel 5:
属性を一括で割り当ててモデルを作成するために使用できる方法は、firstOrCreatefirstOrNewの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']);
6
Salar

主キーに基づいて検索または新規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();
6
Majbah Habib

FirstOrCreateを使用できます(Laravel 4.2で動作します)

$bucketUser = BucketUser::firstOrCreate([
    'bucket_id' => '1',
    'user_id'   => '2',
]);

見つかったインスタンスまたは新しいインスタンスを返します。

2
Mahmoud Zalt