Hoe het model uit de database in Laravel opnieuw te laden/vernieuwen?

In sommige van mijn tests heb ik een gebruikersmodel gemaakt en voer ik een aantal methoden uit die bepaalde attributen moeten opslaan. In rails roep ik meestal iets als user.reloadaan, waarmee de attributen uit de database opnieuw worden ingevuld.

Is er een manier in laravel om dat te doen? Ik heb de api doorgelezen en kon er geen methode voor vinden: http://laravel.com /api/4.1/Illuminate/Database/Eloquent/Model.htmlEnig idee over de “juiste” manier om dit te doen?


Antwoord 1, autoriteit 100%

Er is een toezeggingingediend bij de 4.0-tak die in augustus is gemaakt om een ​​herlaadbeurt toe te voegen () methode, maar tot nu toe is het niet samengevoegd met de nieuwere Laravel branches.

Maar… Laravel 5 biedt een “fresh()”-methode die een nieuwe instantie van het huidige model retourneert. Zodra u Laravel 5.0 of nieuwer gebruikt, kunt u een model als volgt opnieuw laden:

$model = $model->fresh(); 

Houd er rekening mee dat fresh() uw bestaande $model niet rechtstreeks bijwerkt, het retourneert alleen een nieuwe instantie, dus daarom moeten we “$model = ” gebruiken.Het accepteert ook een parameter dat is een reeks relaties waarvan u wilt dat deze gretig wordt geladen.

Als je Laravel 5 nog niet gebruikt maar dezelfde functionaliteit wilt, kun je deze methode aan je model(len) toevoegen:

public function fresh(array $with = array())
{
    $key = $this->getKeyName();
    return $this->exists ? static::with($with)->where($key, $this->getKey())->first() : null;
}

Update:als je Laravel 5.4.24 of nieuwer gebruikt, is er nu een $model->refresh()-methode die je kunt gebruiken om te vernieuwen de attributen en relaties van het object op hun plaats in plaats van een nieuw object op te halen zoals fresh()doet. Zie het antwoord van Jeff Puckett voor meer informatie hierover.


Antwoord 2, autoriteit 80%

Dankzij PR#19174beschikbaar sinds 5.4.24is de refresh-methode.

$model->refresh();

Op deze manier heb je niet te maken met hertoewijzing, zoals in andere antwoorden wordt getoond met de fresh-methode, wat over het algemeen niet handig is als je een model wilt vernieuwen dat is doorgegeven aan een andere methode omdat de toewijzing van de variabele buiten het bereik valt voor de aanroepende contexten om later te gebruiken.


Antwoord 3, autoriteit 51%

  • refresh()is een veranderlijke bewerking: het laadt de huidige modelinstantie opnieuw uit de database.
  • fresh()is een onveranderlijke bewerking: het retourneert een nieuwe modelinstantie uit de database. Het heeft geen invloed op de huidige instantie.
// Database state:
$user=User::create([
  'name' => 'John',
]);
// Model (memory) state:
$user->name = 'Sarah';
$user2 = $user->fresh();
// $user->name => 'Sarah';
// $user2->name => 'John'
$user->refresh();
// $user->name => 'John'

Antwoord 4, autoriteit 18%

Ik kan het ook niet zien. Het lijkt erop dat je het volgende moet doen:

$model = $model->find($model->id);

Je kunt er ook zelf een maken:

public function reload()
{
    $instance = new static;
    $instance = $instance->newQuery()->find($this->{$this->primaryKey});
    $this->attributes = $instance->attributes;
    $this->original = $instance->original;
}

Ik heb het net hier getest en het lijkt erop dat het werkt, ik weet niet zeker hoe ver dit gaat, maar Eloquen is een behoorlijk grote klasse.


Antwoord 5

Ik geloof dat het antwoord van @Antonio het meest correcte is, maar afhankelijk van de gebruikssituatie kunt u ook een combinatie gebruiken van $model->setRawAttributesen $model->getAttributes.

$users = User::all();
foreach($users as $user)
{
    $rawAttributes = $user->getAttributes();
    // manipulate user as required 
    // ..
    // Once done, return attribute state
    $user->setRawAttributes($rawAttributes);
}

Het belangrijkste nadeel hiervan is dat je alleen de data-attributen “herlaadt”, niet de relaties die je hebt gewijzigd, enz. Dat kan ook als de positieve kant worden beschouwd.

BEWERKEN

Vanaf L5 – fresh()is de juiste keuze

Other episodes