web-dev-qa-db-fra.com

Trouvez ou créez avec Eloquent

J'ai récemment commencé à travailler avec Laravel et Eloquent , et je me demandais s'il n'y avait pas d'option de recherche ou de création pour les modèles. Vous pouvez toujours écrire, par exemple:

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

Mais n'y a-t-il pas une meilleure façon de trouver ou de créer? Cela semble trivial dans l'exemple, mais pour des situations plus complexes, il serait très utile d'obtenir un enregistrement existant et de le mettre à jour ou d'en créer un nouveau.

26
charleyh

Vous trouverez ci-dessous la réponse d'origine acceptée pour: laravel-4

Il existe déjà une méthode findOrFail disponible dans Laravel et lorsque cette méthode est utilisée, elle lance ModelNotFoundException en cas d'échec mais dans votre cas, vous pouvez le faire en créant une méthode dans votre modèle , par exemple, si vous avez un modèle User, il vous suffit de mettre cette fonction dans le modèle

// Put this in any model and use
// Modelname::findOrCreate($id);
public static function findOrCreate($id)
{
    $obj = static::find($id);
    return $obj ?: new static;
}

Depuis votre contrôleur, vous pouvez utiliser

$user =  User::findOrCreate(5);
$user->first_name = 'Jhon';
$user->last_name = 'Doe';
$user->save();

Si un utilisateur avec id od 5 Est exixte, il sera mis à jour, sinon un nouvel utilisateur sera créé mais le id sera last_user_id + 1 (incrémenté automatiquement).

C'est une autre façon de faire la même chose:

public function scopeFindOrCreate($query, $id)
{
    $obj = $query->find($id);
    return $obj ?: new static;
}

Au lieu de créer une méthode statique, vous pouvez utiliser un scope dans le modèle, donc la méthode dans le Model sera scopeMethodName et appellera Model::methodName(), même comme vous l'avez fait dans la méthode statique, par exemple

$user =  User::findOrCreate(5);

Mise à jour:

Le firstOrCreate est disponible dans Laravel 5x, La réponse est trop ancienne et elle a été donnée pour Laravel-4.0 Dans 2013.

Dans Laravel 5.3, la méthode firstOrCreate a la déclaration suivante:

public function firstOrCreate(array $attributes, array $values = [])

Ce qui signifie que vous pouvez l'utiliser comme ceci:

User::firstOrCreate(['email' => $email], ['name' => $name]);

L'existence de l'utilisateur ne sera vérifiée que par e-mail, mais une fois créé, le nouvel enregistrement enregistrera à la fois l'e-mail et le nom.

Documents API

56
The Alpha

Alternativement, dans ce cas, vous pouvez également utiliser la fonction de Laravel et rechercher id comme attribut, c'est-à-dire.

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

Les modèles Laravel 4 ont une méthode intégrée findOrNew qui fait ce dont vous avez besoin:

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

Dans Laravel 5:
Il existe deux méthodes que vous pouvez utiliser pour créer des modèles en affectant en masse des attributs: firstOrCreate et firstOrNew.
La méthode firstOrCreate tentera de localiser un enregistrement de base de données à l'aide des paires colonne/valeur données. Si le modèle ne peut pas être trouvé dans la base de données, un enregistrement sera inséré avec les attributs donnés.
La méthode firstOrNew, comme firstOrCreate tentera de localiser un enregistrement dans la base de données correspondant aux attributs donnés. Cependant, si aucun modèle n'est trouvé, un ne nouvelle instance de modèle sera retournée. Notez que le modèle renvoyé par firstOrNew n'a pas encore été conservé dans la base de données. Vous devrez appeler save manuellement pour le conserver:

// 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

Rechercher ou Nouveau en fonction de la clé primaire id

$user = User::findOrNew($id); // if exist then update else insert
$user->name= $data['full_name'];
$user->save();

Premier ou nouveau basé sur une clé non primaire fichier unique

// get the record where field_name=value else insert new record
$user = User::firstOrNew(['field_name'=>'value']); 
$user->name= $data['full_name'];
$user->save();

Premier ou nouveau basé sur une clé non primaire plusieurs dépôts

// 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

Vous pouvez utiliser firstOrCreate (Cela fonctionne avec Laravel 4.2)

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

renvoie une instance trouvée ou une nouvelle instance.

2
Mahmoud Zalt