Ich habe ein Modell Driver mit Spalten: name, branch, status_id, etc.. Die Aktualisierung ist in Ordnung und funktioniert. Mein Problem ist, wie kann ich das aktualisierte zurückgeben?

Folgendes habe ich bisher versucht, aber es wird ein boolean zurückgegeben, das auf die Rückgabe eines Fehlers in meiner Konsole zurückzuführen ist:

Der Antwortinhalt muss eine Zeichenfolge oder ein Objekt sein, das __toString () implementiert, wobei "boolean" angegeben ist.

public function updateStatus(Driver $driver)
{
    return $driver->update($this->validateStatus());
}

public function validateStatus()
{
    return $this->validate(request(), [
        'status_id' => 'required|min:1|max:3'
    ]);
}

Ich erwarte, dass alle Spalten eines Treibers zurückgegeben werden.

Ich war auf diesem Link, aber es hat nicht geholfen. Weiß jemand wie das geht?

1
charles 7 Feb. 2020 im 15:23

4 Antworten

Beste Antwort

Rückgabe als Objekt anstelle des booleschen Typs

public function updateStatus(Driver $driver)
{
   $driver->update($this->validateStatus());
   return $driver;// first way
   // return tap($driver)->update($this->validateStatus()); //second way
}

public function validateStatus()
{
    return $this->validate(request(), [
        'status_id' => 'required|min:1|max:3'
    ]);
}
1
Jignesh Joisar 7 Feb. 2020 im 12:36

Sie können den tap() -Helfer verwenden, der das aktualisierte Objekt nach dem Update wie folgt zurückgibt:

return tap($driver)->update($this->validateStatus());

Mehr dazu hier: Tipp auf Helfer

4
Sebastian Sulinski 7 Feb. 2020 im 12:41

Ich weiß, dass es bereits eine Antwort darauf gibt, aber im Idealfall möchten Sie die Aktualisierungsmethode nicht verwenden. Es ist nur eine Modellhilfemethode, die nicht wirklich viel hinzufügt. Intern macht es das, was ich unten angegeben habe, außer dass es das Ergebnis von save() zurückgibt.

Sie möchten so etwas tun:

if ($driver->fill($this->validateStatus)->save()) {
    return $driver;
}

throw new \RuntimeException('Update failed, perhaps put something else here);

Das Problem mit der akzeptierten Antwort (und den meisten anderen) besteht darin, dass Sie das Modell zurückgeben, ohne jemals zu überprüfen, ob es tatsächlich aktualisiert wurde, sodass Sie später auf Probleme stoßen, wenn es nicht aktualisiert wird die eigentliche Datenbank, obwohl sie meldet, dass dies der Fall ist.

0
ollieread 7 Feb. 2020 im 13:13

Ich denke, dafür brauche ich keinen Modellhelfer

In Controller können Sie dies tun

$driver = Driver::find(1);
$driver->name = "expmale";
$driver->save();

return $driver;

Oder anders

$driver = Driver::find(1);
$driver->update([
      'name'=> "expmale"
      ]);

return $driver;
2
Kamlesh Paul 7 Feb. 2020 im 12:48