Мутации Laravel 5 работают только при создании записи, а не при обновлении записи

Привет, я создал мутатор, чтобы хранить только цифры на своих телефонах. Вот мой код в моей модели профиля.

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

Это работает, когда я создаю новую запись, но если я обновляю запись, она не работает. Мой вопрос: как я могу выполнить Mutator как для создания, так и для обновления?

Вот как я обновляю и создаю в своем контроллере:

 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; } } 

Вот что происходит:

Auth::user()->profile()->create($request->all()) вызывает метод create в ваших отношениях ( HasOneOrMany ). Затем этот метод создает новый экземпляр связанной модели . Это важно, потому что, очевидно, атрибутные атрибуты используются только тогда, когда запись создается через модель .

Однако объект отношения не имеет никакого метода update . (Также было бы бессмысленно иметь один …). Так что происходит вместо этого, когда вы выполняете Auth::user()->profile()->update($request->all()) . Запрос на update get проксируется на экземпляр построителя запросов (который соответствует отношениям). Это приводит к тому, что это выполняется:

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

Он вообще не использует модель . Поэтому мутатор не работает.

Вместо этого вам нужно вызвать метод update на фактическую связанную модель. Вы можете получить к нему доступ, просто называя это отношение следующим свойством:

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

Если модель Profile вводится правильно, вы, возможно, также можете использовать это:

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

Использование этого кода вместо кода

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