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