Это мой текущий метод создания;
public function create(Request $request)
{
// 1. create a uuid string
$uuid1 = Uuid::uuid1();
$uuid = $uuid1->toString();
// 2. check if it already exists in the database
$response = Response::where('uuid', $uuid)->first();
// 3. if it does, run this method again and get a new uuid
if ($response) {
return $this->create($request);
}
// 4. create an array with a uuid key and put the value in it
$data['uuid'] = $uuid;
// 5. create the record in the database
$response = Response::create($data);
// 6. look up the record I have just created to return in order to return the group
$response = Response::where('uuid', $response->uuid)->first();
// 7. redirect passing the uuid and the group
return redirect()->route('survey', ['uuid' => $response->uuid, 'group' => $response->group]);
}
Части этого кажутся немного чрезмерными. Есть ли какой-нибудь способ безопасно это исправить? В частности, шаг 6. Нет ли способа объединить его с 5 и сразу ссылаться на созданную мной запись?
Кроме того, есть ли способ, которым я могу удалить шаги 2 и 3 и быть уверенным, что Uuid никогда не будет дубликатом? Я знаю, что шансы чрезвычайно малы, но все же.
Получить UUID практически невозможно, поэтому вы можете безопасно удалить шаги 2 и 3. Хотя, если вы хотите проверить UUID в базе данных, вы можете использовать do-while-loop
вместо шагов 1, 2 и 3:
do {
$uuid = (string) Uuid::uuid1();
} while ($response = Response::where('uuid', $uuid)->first());
Далее вам не нужно запускать шаг 6. Request::create
вернет объект Eloquent Request, чтобы вы могли использовать его на шаге 7. $response->group
должен быть извлечен ленивой нагрузкой.
Других решений пока нет …