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

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

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

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

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

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

person OsvyG    schedule 27.03.2015    source источник
comment
Не могли бы вы отредактировать свой вопрос и добавить код, показывающий, как вы обновляете/создаете запись?   -  person lukasgeiter    schedule 27.03.2015


Ответы (2)


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

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

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

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;
}
person lukasgeiter    schedule 27.03.2015
comment
Спасибо! это имеет большой смысл. Это устранило мою проблему: $saveToDatabase = $profile-›update($request-›all()); - person OsvyG; 27.03.2015

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

$saveToDatabase = Auth::user()->profile->update($request->all());
person mininoz    schedule 27.03.2015