2016-01-29 1 views
1

Я работаю в Laravel 5.1 и сохраняю gecko в базе данных. Мой код для моего store метода ниже:Laravel 5.1 - Создайте уникальный 10 буквенно-цифровой код символа при сохранении в базе данных

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('[email protected]', [$name]); 

} 

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

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

ответ

5

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

public function randomId(){ 

    $id = str_random(10); 

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

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

    return $id; 
} 
+0

Мне нужно проверить другие версии, но это действительно работает. Скоро вернусь к вам –

0

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

У поставщика услуг или вашего 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. 
    }); 
} 

Full documentation for eloquent model events.

0

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

do 
    { 
     $code = // generate your code 
     $gecko_code = Gecko::where('code', $code)->first(); 
    } 
    while(!empty($gecko_code)); 
+0

Будет ли это помещено в контроллер? Нужно ли мне делать что-нибудь еще для этого, чтобы сохранить это поле? –

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