(laravel красноречивый) получить ближайшие значения (чаевые игры)
Я создал игру чаевых, пользователи могут угадать значение, и через 12 часов текущий курс USD / EUR будет взят запросом API, и победители, которые опрокинули ближайшее значение, выиграют (только один победитель, в случае, если N пользователей опрокинули одинаковую сумму, все они выиграют).
Как получить" ближайший " совет из базы данных?
foreach ($rounds_closed as $round_closed)
{
//get latest rate
$amount = 458.12;
//set transaction as processed and set latest rate
$round_closed->update([
'status' => 2,
'win_tip' => $amount,
]);
//get lucky winners
//here I would need eloquent code to choose the "nearest" winners
$winners_transactions = Transaction::where('round_id', $round_closed->id)->where('assessment', $round_closed->win_tip)->get();
//if we have at least one winner
if ($winners_transactions->count() > 0)
{
//calculate their win amount
$sum = $round_closed->transactions->sum('amount');
$fee = $sum * 0.10;
$sum = $sum - $fee;
$sum = number_format($sum / $winners_transactions->count(), 8, '.', '');
foreach ($winners_transactions as $winner_transaction)
{
//mark transaction as payed out
$winner_transaction->update([
'payout' => 1,
]);
//payout user
}
}
}
1 ответ:
Я не знаком с синтаксисом вашего фреймворка, но вот возможный подход в SQL, который вы можете рефакторировать:
SET @amount = 458.12; #Order tips by smallest difference and return the first result SET @winning_tip = (SELECT tip FROM tips ORDER BY ABS(tip-@amount) ASC LIMIT 1); #Return all users with the winning tip value SELECT userid, tip, ABS(tip-@amount) AS delta FROM tips WHERE tip = @winning_tip
Http://sqlfiddle.com/#!9 / fac65/2
В зависимости от размера ваших данных, вы также можете отозвать все транзакции и закодировать вышеупомянутую логику вне SQL.
Главное, вам нужно определить, какой совет ближе всего к сумме, и использовать его в качестве параметра для выбора / фильтрации ваших победителей.