Laravel Update se il record esiste o Crea se non

Voglio aggiornare il mio record se esiste ma ne creo uno nuovo se non esiste. ecco, sono arrivato così lontano:

MerchantBranch.php public function token() { return $this->hasOne('App\MerchantBranchToken'); } MerchantBranchToken.php public function merchant_branch() { return $this->belongsTo('App\MerchantBranch'); } $find = MerchantBranchToken::find($id); if (!$find) { $branch = new MerchantBranchToken(['token' => $token]); MerchantBranch::find($id)->token()->save($branch); } else { $find->token = $token; $find->save(); } 

Funziona perfettamente.

Ma come so Laravel è molto potente per il suo model eloquente. Posso renderlo più breve? o lo sto già facendo correttamente?

Ho provato a utilizzare il metodo "updateOrCreate" ma la mia chiave esterna "merchant_branch_id" deve essere compilabile.

Laravel utilizza già questa metodologia per function di save

 $user->save() 

Codice Laravel

 // If the model already exists in the database we can just update our record // that is already in this database using the current IDs in this "where" // clause to only update this model. Otherwise, we'll just insert them. if ($this->exists) { $saved = $this->performUpdate($query); } // If the model is brand new, we'll insert it into our database and set the // ID attribute on the model to the value of the newly inserted row's ID // which is typically an auto-increment value managed by the database. else { $saved = $this->performInsert($query); } 

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L1491

->exists

Tutti i templates laravel hanno una properties; ->exists .

Più specificamente se il model è caricato dal database, o è stato salvato nel database da quando è stato creato, la properties; exists sarà vera; Altrimenti sarà falso.

Se capisci che ->exists puoi usarlo, ma qui c'è un altro modo per gestire tale requisito.

in un altro modo

 /** * Create or update a record matching the attributes, and fill it with values. * * @param arrays $attributes * @param arrays $values * @return static */ public static function updateOrCreate(arrays $attributes, arrays $values = arrays()) { $instance = static::firstOrNew($attributes); $instance->fill($values)->save(); return $instance; } 

Laravel fornisce metodo updateOrCreate a tale scopo

  • Se c'è un volo da Oakland a San Diego, imposta il prezzo a $ 99.

  • Se non esiste alcun model corrispondente, crearne uno.

 $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] ); 

Aggiungi un nuovo codice function:

vendor / laravel / framework / src / Illuminate / Database / Eloquent / Builder.php:

  public function updateOrInsert(arrays $attributes, arrays $values = []) { $instance = $this->where($attributes); if ($instance->count() != 0) { $instance->update($values); } else { $instance = $this->updateOrCreate($attributes, $values); } return $instance; }