Привет, я создал мутатор, чтобы хранить только цифры на своих телефонах. Вот мой код в моей модели профиля.
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());