(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 2

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.

Главное, вам нужно определить, какой совет ближе всего к сумме, и использовать его в качестве параметра для выбора / фильтрации ваших победителей.