PHP / Laravel: получить новую информацию о модели после сохранения () - PullRequest
3 голосов
/ 21 октября 2019

Вот моя проблема: у меня есть таблица в базе данных sqlserver следующим образом:

Product ( 
 id int identity,
 reference varchar(12),
 name varchar(40)
)

На веб-странице веб-приложения laravel я получил форму с именем только в качестве поля и кнопкой отправки. ,На стороне БД я создал триггер (вместо вставки), который обновляет ссылку на строку на основе сгенерированного идентификатора. Пример:

RGX0000123

Где 123 - сгенерированный идентификатор, а RGX генерируется случайным образом.

Поток следует шаблону публикации / перенаправления / получения. После отправки я хочу перенаправить на страницу, где в URL отображается ссылка, а не идентификатор.

В контроллере laravel я сохраняю свой объект с помощью Eloquent и перенаправляю на следующую страницу:

$product->save();
return redirect()->route('next_page', ['reference' => $product->reference]);

Моя проблема в том, что я могу получить идентификатор после сохранения, но не ссылку. Я не знаю, как работает Eloquent, но с Hibernate (JAVA) такое можно решить с помощью session.flush () для синхронизации объекта с данными из базы данных.

Быстрое и грязное исправление с использованием

$product= Product::find($product->id);

Есть ли более чистый способ справиться с этим?

Ответы [ 2 ]

6 голосов
/ 21 октября 2019

Попробуйте обновить объект:

$product->save();
$product->refresh(); // <---

return redirect()->route('next_page', ['reference' => $product->reference]);

Из документации :

Обновление моделей

Вы можете обновить модели с помощьюfresh и refresh методы. Метод fresh восстановит модель из базы данных. На существующий экземпляр модели это не повлияет:

$flight = App\Flight::where('number', 'FR 900')->first();

$freshFlight = $flight->fresh();

Метод refresh повторно гидратирует существующую модель с использованием свежих данных из базы данных. Кроме того, будут обновлены все загруженные отношения:

$flight = App\Flight::where('number', 'FR 900')->first();

$flight->number = 'FR 456';

$flight->refresh();

$flight->number; // "FR 900"
1 голос
/ 21 октября 2019

Вы можете использовать метод refresh () для обновления данных в модели

$ model-> refresh ();

...