Laravel предотвратить дубликаты - PullRequest
1 голос
/ 22 марта 2020

У меня есть доктор aws на моем сайте. Один раз в день начинается новый розыгрыш. Но есть проблема, что есть дубликат др aws. То есть у меня есть таблица с именем items, в которой есть список предметов из Dota 2, в этой таблице есть столбец market_hash_name, is_giveaway. И есть код, который выбирает элементы для рисования:

$betitem = \DB::table('items')->where('status', 0)->where('is_giveaway', 0)->where('steamid', 1)->where('price', '=', 26)->orderByRaw('RAND()')->take(1)->get();

После получения этого элемента создается чертеж с полученными параметрами в таблице giveaway. Пример ответа, полученного для создания розыгрыша:

array(1) { [0]=> object(stdClass)#585 (14) { ["id"]=> int(553) ["assetid"]=> string(11) "18235855873" ["market_hash_name"]=> string(17) "Full-Bore Bonanza" ["classid"]=> string(206) "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcUhpxJNSV6fVOqkx8rBbF51NQFov7eoJBV00v-HYjNL_Nmkq4OKh_LLOrbcmXlF6ck_j7nAoNqt0QHg_kFuMm36JdWWdQA7YwyG_QK3wLq8jZ7v6JjKzHFqsj5iuyi7wGzR_A" ["price"]=> float(26) ["steamid"]=> string(1) "1" ["type"]=> string(4) "card" ["bot"]=> string(1) "1" ["status"]=> int(0) ["created_at"]=> string(19) "2020-02-27 03:47:12" ["updated_at"]=> string(19) "2020-03-22 15:53:34" ["is_withdraw"]=> int(0) ["discount"]=> float(0) ["is_giveaway"]=> int(0) } }

Основная проблема заключается в том, что ничья с этим значением market_hash_name уже находится на сайте, и она все еще создает новую с тем же самым имя. Как я могу пропустить дубликаты?

Вот моя функция, которая добавляет dr aws:

public function add_giveaway()
{
    $betitem = \DB::table('items')->where('status', 0)->where('is_giveaway', 0)->where('steamid', 1)->where('price', '=', 26)->orderByRaw('RAND()')->take(1)->get();
    $raffling_price = $betitem[0]->price;
    $green_tickets = $betitem[0]->price;
    $market_name = $betitem[0]->market_hash_name;
    $market_classid = $betitem[0]->classid;
    $market_assetid = $betitem[0]->assetid;
    $market_id = $betitem[0]->id;
    $is_giveaway = Item::where('id', '=', $betitem[0]->id)->update(['is_giveaway' => '1']);
    $check_duplicate = Item::where('market_hash_name')->where('is_giveaway', "=", 1)->get();
    if ($raffling_price < 20) {
        $max_users = mt_rand(5, 10);    
    } elseif ($raffling_price < 50) {
            $max_users = mt_rand(10, 25);    
    } elseif ($raffling_price < 150) {
            $max_users = mt_rand(25, 50);    
    } elseif ($raffling_price < 250) {
            $max_users = mt_rand(50, 100);    
    }
    $betitem_id = \DB::table('items')->where('status', 0)->where('price', '=', 26)->orderByRaw('RAND()')->take(1)->pluck('id');
    \DB::table('giveaway_items')->where('id',$betitem_id)->update(['status' => 3]);
    $giveaway = Giveaway::create(['max_user' => $max_users, 'green_tickets' => round($green_tickets / 15), 'price' => $raffling_price, 'items' => $market_name, 'classid' => $market_classid, 'assetid' => $market_assetid, 'item_id' => $market_id]);
}

$check_duplicate это тестовая переменная для получения дубликатов, но она не работает.

Где проблема? Как исправить дубликаты?

1 Ответ

1 голос
/ 23 марта 2020

Если честно, этот код повсюду, с точки зрения стиля, фрагментов и использования различных фасадов. Кажется, главная проблема l ie в where('market_hash_name'), это неправильный способ сделать там, где logi c.

Я все вычистил, главное в logi c - извлечь betItem пока вы не найдете тот, который не является дубликатом, я бы go выяснил, почему ваши данные неверны, но сейчас это исправляет. Если повторяется, продолжите оператор while().

$betitem = null;
$found = false;

while(! $found) {
    $betitem = $this->getBetItem();

    $duplicate = $this->checkDuplicate($betitem);

    if ($duplicate) {
        continue ;
    }

    $betitem->is_giveaway = '1';
    $betitem->save();

    $found = true;
}

Этот код нуждается в некоторых помощниках. Во-первых, как получить betItem.

public function getBetItem()
{
    return Item::where('status', 0)
        ->where('is_giveaway', 0)
        ->where('steamid', 1)
        ->where('price', 26)
        ->orderByRaw('RAND()')
        ->first();
}

Другой помощник - проверить дубликат.

public function checkDuplicate($betitem)
{
    return Item::where('market_hash_name', $betitem->market_hash_name)
        ->where('is_giveaway', 1)
        ->exists();
}

Для синтаксиса c sugar я добавил функцию maxUsers().

public function maxUsers($betitem)
{
    $raffling_price = $betitem->price;

    if ($raffling_price < 20) {
        return mt_rand(5, 10);    
    } elseif ($raffling_price < 50) {
        return mt_rand(10, 25);    
    } elseif ($raffling_price < 150) {
        return mt_rand(25, 50);    
    } elseif ($raffling_price < 250) {
        return mt_rand(50, 100);    
    }
}

Вероятно, есть какой-то способ go, вам нужно поиграться с собственным кодом, я надеюсь, что этот пример показывает пример более чистого кода, который должен работать. Также для этих случаев было бы нормально выполнить транзакцию, которая обеспечит защиту базы данных, которая не сможет писать одни и те же обновления несколько раз, но заблокирует таблицу в процессе. Таким образом, основная функция будет выглядеть так, используя все помощники.

public function addGiveaway()
{
    DB::transaction(function () {
        $betitem = null;
        $found = false;

        while(! $found) {
            $betitem = $this->getBetItem();

            $duplicate = $this->checkDuplicate($betitem);

            if ($duplicate) {
                continue ;
            }

            $betitem->is_giveaway = '1';
            $betitem->save();

            $found = true;
        }

        $max_users = $this->maxUsers($betitem);

        $giveaway = Item::where('status', 0)->where('price', '=', 26)->orderByRaw('RAND()')->first();

        \DB::table('giveaway_items')->where('id', $giveaway->id)->update(['status' => 3]);

        $giveaway = Giveaway::create([
            'max_user' => $max_users,
            'green_tickets' => round($betitem->price / 15),
            'price' => $betitem->price,
            'items' => $betitem->market_hash_name,
            'classid' => $betitem->classid,
            'assetid' => $betitem->assetid,
            'item_id' => $betitem->id
        ]);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...