Мутаторы 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;
}
}

9

Решение

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

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

Другие решения

Используя этот код вместо вашего кода

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

По вопросам рекламы [email protected]