2015-03-27 16 views
7

Ciao Ho creato un mutatore per memorizzare solo cifre sui miei numeri di telefono. Ecco il mio codice nel mio modello di profilo.I mutanti di Laravel 5 funzionano solo quando creo un record e non quando aggiorno un record

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

Questo funziona quando creo un nuovo record, ma se aggiorno il record non funziona. La mia domanda è: come eseguo il Mutator sia in fase di creazione che di aggiornamento?

ecco come lo aggiorno e creo nel mio controller:

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

Potete per favore modifica la tua domanda e aggiungi il codice che mostra come aggiorni/crei il record – lukasgeiter

risposta

17

Ecco cosa sta succedendo:

Auth::user()->profile()->create($request->all()) chiama il metodo create su il tuo rapporto (HasOneOrMany). Questo metodo crea quindi una nuova istanza del modello correlato. Questo è importante perché ovviamente i mutatori di attributo vengono utilizzati solo quando viene creato il record tramite il modello.

Tuttavia l'oggetto relazione non ha alcun metodo update. (Non avrebbe neanche senso averne uno ...). Quindi quello che succede invece è, quando lo fai, Auth::user()->profile()->update($request->all()). La chiamata update viene inoltrata a un'istanza del generatore di query (che corrisponde alla relazione). Ciò si traduce in qualcosa di simile in esecuzione:

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

Non usa il modello a tutti. Pertanto il mutatore non funziona.

Invece è necessario chiamare il metodo update sul modello correlato effettivo. È possibile accedervi semplicemente chiamando il rapporto come una proprietà come questa:

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

Se il modello Profile viene iniettato correttamente in realtà si potrebbe anche semplicemente usare che anche se:

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

Grazie! questo ha molto senso. Risolto il problema: $ saveToDatabase = $ profile-> update ($ request-> all()); – OsvyG

0

Utilizzando questo codice al posto del codice

$saveToDatabase = Auth::user()->profile->update($request->all()); 
Problemi correlati