Проверка Php / Laravel на наличие дубликатов в цикле

0

Я пытаюсь проверить, была ли сгенерированная строка в моей таблице базы данных или нет.

Если нет дубликата, я хочу вернуться и сохранить его.

Если есть дубликат, я хочу сгенерировать новую строку и сохранить ее в настоящее время, эта функция не возвращает мне сгенерированный токен:

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);
  • 1
    Вы можете использовать где условие в запросе.
  • 0
    Не делайте это ... Чем больше таблица , чем дольше он будет принимать , чтобы проверить, и вы можете в конечном итоге в проверке дважды или трижды или п раз (навсегда); используйте UUID вместо этого дизайна дерьма !
Показать ещё 2 комментария
Теги:
loops

3 ответа

2
Лучший ответ

Упрощенная версия вашего кода:

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;
}
  • 0
    Я думаю, что это while ($duplicate->isNotEmpty()); !!
  • 0
    Если ->get(); возвращает пустую Collection , в то while($duplicate); приравнивать к true в каждом цикле независимо от? Я бы либо использовал while(count($duplicate) == 0); или переключите закрытие этого запроса на ->first(); , поскольку это возвращает null если нет совпадений. При этом я могу ошибаться; Я забыл, как приравниваются пустые коллекции.
Показать ещё 2 комментария
0

Вы можете проверить следующее:

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);

Надеюсь, вы понимаете.

0

Вместо того, чтобы использовать:

$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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню