Я работаю в 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);
— Но как мне обеспечивать на самом деле он уникален и не будет перенаправлять обратно на мою форму, если он не уникален?
Есть ли надлежащая практика для достижения чего-то подобного?
Создайте функцию, которая генерирует 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;
}
Из того, что я понимаю по вашему вопросу, вы могли бы добиться этого, используя созданное событие в модели. Это позволит вам добавить что-либо к модели, прежде чем она будет сохранена в базе данных без какого-либо дополнительного взаимодействия.
У поставщика услуг или вашего 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.
});
}
Вот что я использовал раньше:
do
{
$code = // generate your code
$gecko_code = Gecko::where('code', $code)->first();
}
while(!empty($gecko_code));