2016-10-09 4 views
0

У меня есть "принадлежитТо" отношение.Laravel 5 обновление возвращает старое отношение

public function relation() 
{ 
    return $this->belongsTo('App\Relation', 'relation_id'); 
} 

Когда я создаю экземпляр, все работает так, как ожидалось. Он возвращает новый экземпляр, включая отношение.

public function store(Request $request) 
{ 
    $instance = $this->model->create($request->all()); 

    return $instance; 
} 

Когда я обновляю "relation_id" Это возвращает старое отношение. Он не возвращается немедленно.

public function findOrFail($id) 
{ 
    $link = $this->model 
     ->with('relation') 
     ->findOrFail($id); 

    return $link; 
} 

public function update(Request $request, $id) 
{ 
    $instance = $this->findOrFail($id); 

    $instance->update($request->all()); 

    //$instance = $instance ->fresh(); 

    return $instance ; 
} 

Кажется, что с помощью $ instance-> свежие() или удаление -> с ('отношение') новое отношение возвращается немедленно в текущем экземпляре.

Мне интересно, почему он не возвращает новое отношение немедленно, как это делается для create.

ответ

0

create() функция возвращает экземпляр см API DOC on create()
update() возвращает boolAPI DOC on update() см

После обновления, вы необходимости перезагрузить отношения с помощью load() или fresh(), как вы заявили.

Вы обновляете текущую модель/таблицу только с привязанными к ней отношениями.


Скорее всего вам не хватает (или неправильно) $fillable массив в вашей модели. Что защищает вас от уязвимости «массового присвоения».

Подробнее о теме в документации here.

Уязвимость массового присвоения возникает, когда пользователь передает неожиданный параметр HTTP через запрос, и этот параметр меняет столбец в вашей базе данных, чего вы не ожидали. Например, злоумышленник может отправить параметр is_admin через HTTP-запрос, который затем передается в метод создания вашей модели, позволяя пользователю эскалации себя администратору.


Совет:

Не используйте $request->all(), вместо того, чтобы использовать $request->only(['name', 'age']) теперь его явно, используя только name и age параметров. Я знаю, что это не СУХОЙ, потому что вы должны поддерживать $fillable в синхронизации с массивом ->only, но любой, кто не знает этого кода, будет знать, что происходит с контроллером.

Смежные вопросы