Я пытаюсь проверить, была ли сгенерированная строка в моей таблице базы данных или нет.
Если нет дубликата, я хочу вернуться и сохранить его.
Если есть дубликат, я хочу сгенерировать новую строку и сохранить ее в настоящее время, эта функция не возвращает мне сгенерированный токен:
public function checkForHashDuplicate($string)
{
$newToken = '';
$inquiries = DB::table('inquiries')->get();
foreach($inquiries as $inquiryKey => $inquiryValue)
{
while($inquiryValue->android_device_token == $string)
{
$newToken = generateAlphanumericString();
if($newToken != $inquiryValue->android_device_token)
{
return $newToken;
}
}
}
}
$inquiry->android_device_token = $this->checkForHashDuplicate($hash);
Упрощенная версия вашего кода:
public function checkForHashDuplicate($string)
{
do {
// generate token
$newToken = generateAlphanumericString();
// find token in a DB
$duplicate = DB::table('inquiries')
->where('android_device_token', '=', $newToken)->first();
// if token is FOUND '$duplicate' has truthy value
// and 'do-while' keeps running
// else '$duplicate' is falsy and 'do-while' breaks
} while ($duplicate);
return $newToken;
}
while ($duplicate->isNotEmpty());
!!
->get();
возвращает пустую Collection
, в то while($duplicate);
приравнивать к true
в каждом цикле независимо от? Я бы либо использовал while(count($duplicate) == 0);
или переключите закрытие этого запроса на ->first();
, поскольку это возвращает null
если нет совпадений. При этом я могу ошибаться; Я забыл, как приравниваются пустые коллекции.
Вы можете проверить следующее:
public function checkDuplicate($string){
$count = DB::table('inquiries')->where('android_device_token',$string)->count();
if($count==0){
// $string exists
return generateAlphanumericString();
}else{
// $string doesn't exists
return $string;
}
}
Теперь используйте эту функцию, чтобы присвоить значение $string
или new token как
$inquiry->android_device_token = $this->checkForHashDuplicate($hash);
Надеюсь, вы понимаете.
Вместо того, чтобы использовать:
$inquiries = DB::table('inquiries')->get();
и цикл, используйте, where
:
$inquiries = DB::table('inquiries')->where('android_device_token', '=', $string)->get();
if( count($inquiries ) == 1 )
{
// found
}
else
{
// Not found, generate new one
}