Laravel 5.1 — генерирует уникальный 10 буквенно-цифровой символьный код при сохранении в базе данных

Я работаю в Laravel 5.1 и сохраняю геккона в базе данных. Мой код для моего store Метод ниже:

public function store(GeckoRequest $request)
{
$user_id = Auth::user()->id;
$input = $request->all();

$input['genetics'] = json_encode($input['genetics'], JSON_FORCE_OBJECT);
$input['user_id'] = $user_id;

Gecko::create($input);

$name = str_replace(' ', '-', $request['name']);

flash()->success('Success!', 'Your gecko has been added to the system');
return redirect()->action('GeckoController@show', [$name]);

}

Я знаю, что мог сделать $input['uid'] = str_random(10); — Но как мне обеспечивать на самом деле он уникален и не будет перенаправлять обратно на мою форму, если он не уникален?

Есть ли надлежащая практика для достижения чего-то подобного?

1

Решение

Создайте функцию, которая генерирует 10-значный случайный ключ, а затем пропускает его через валидатор с уникальным набором правил. Если валидатор выдает ошибку, перезапустите ту же функцию, чтобы сгенерировать новую.

public function randomId(){

$id = str_random(10);

$validator = \Validator::make(['id'=>$id],['id'=>'unique:table,col']);

if($validator->fails()){
return $this->randomId();
}

return $id;
}
6

Другие решения

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

У поставщика услуг или вашего App\Providers\AppServiceProvider добавить событие в метод загрузки.

public function boot()
{
User::creating(function ($user) {
// When ever a User model is created
// this event callback will be fired.
$user->setAttribute('randomString', str_random(10));

// Returning 'false' here will stop the
// creation of the model.
});
}

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

0

Вот что я использовал раньше:

  do
{
$code = // generate your code
$gecko_code = Gecko::where('code', $code)->first();
}
while(!empty($gecko_code));
0
По вопросам рекламы [email protected]