2015-03-27 2 views
7

Hallo Ich habe einen Mutator erstellt, um nur Ziffern auf meinen Telefonnummern zu speichern. Hier ist mein Code in meinem Profilmodell.Laravel 5 Mutatoren funktionieren nur, wenn ich einen Datensatz erstelle und nicht, wenn ich einen Datensatz aktualisiere

public function setPhoneAttribute($phone) 
{ 
    $this->attributes['phone'] = preg_replace("/[^0-9]/","",$phone); 
} 

Dies funktioniert, wenn ich einen neuen Datensatz erstellen, aber wenn ich den Datensatz aktualisieren, funktioniert es nicht. Meine Frage ist, wie führe ich den Mutator sowohl beim Erstellen als auch beim Aktualisieren aus?

Hier ist, wie ich in meinem Controller aktualisieren und erstellen:

namespace App\Http\Controllers; 
use App\Http\Requests; 
use App\Http\Requests\ProfileRequest; 
use App\Http\Controllers\Controller; 
use Illuminate\Http\Request; 
use Auth; 
use App\Profile; 

class ProfileController extends Controller { 

    public function create(ProfileRequest $request) 
    { 
     // Check if the user does not have a profile yet 
     if(!Auth::user()->profile()->first()){ 

      // Save to database 
      $saveToDatabase = Auth::user()->profile()->create($request->all()); 

      return $saveToDatabase; 
     } 
    } 

    public function update(Profile $profile, ProfileRequest $request) 
    { 

     // Save to database 
     $saveToDatabase = Auth::user()->profile()->update($request->all()); 

     return $saveToDatabase; 
    } 
} 
+0

Können Sie mir bitte Bearbeiten Sie Ihre Frage und fügen Sie den Code hinzu, der zeigt, wie Sie den Datensatz aktualisieren/erstellen – lukasgeiter

Antwort

17

Hier ist, was geschieht:

Auth::user()->profile()->create($request->all()) ruft die create Methode auf Ihre Beziehung (HasOneOrMany). Diese Methode erstellt dann eine neue Instanz des verwandten Modells. Dies ist wichtig, da Attribut-Mutatoren offensichtlich nur verwendet werden, wenn der Datensatz über das Modell erstellt wird.

Das Beziehungsobjekt hat jedoch keine Methode update. (Es wäre auch nicht sinnvoll, einen zu haben ...). Was passiert stattdessen, wenn Sie tun Auth::user()->profile()->update($request->all()). Der Aufruf update wird an eine Query Builder-Instanz weitergeleitet (die der Beziehung entspricht). Daraus ergibt sich so etwas wie diese ausgeführt werden:

UPDATE profiles SET foo = 'bar' WHERE [relationship conditions] 

Es ist nicht das Modell bei allen nicht verwendet. Daher funktioniert der Mutator nicht.

Stattdessen müssen Sie die update Methode auf dem tatsächlichen verwandten Modell aufrufen. Sie können darauf zugreifen, indem Sie einfach die Beziehung als eine Eigenschaft wie dieser Aufruf:

$saveToDatabase = Auth::user()->profile->update($request->all()); 
//         ^^ 
//        no parentheses 

Wenn das Profile Modell korrekt eigentlich auch nur, dass, obwohl verwenden könnten Sie injiziert wird:

public function update(Profile $profile, ProfileRequest $request) 
{ 
    // Save to database 
    $saveToDatabase = $profile->update($request->all()); 
    return $saveToDatabase; 
} 
+0

Vielen Dank! das macht sehr viel Sinn. Das behebt mein Problem: $ saveToDatabase = $ profile-> update ($ request-> all()); – OsvyG

0

diesen Code anstelle des Codes

$saveToDatabase = Auth::user()->profile->update($request->all()); 
Verwandte Themen