Если честно, этот код повсюду, с точки зрения стиля, фрагментов и использования различных фасадов. Кажется, главная проблема 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
]);
});
}