php реферальная система

121
16 сентября 2019, 03:10

Пишу многоуровневую реферальную систему с рангами. Т.е. 5 уровней и ранги за кол пригласивших, у каждого разный процент отчислений. При регистрации заношу id пригласившего рефералу. Далее при покупке рефералом пакета делаю отчисления

$dataRef = $this->db->column('SELECT ref FROM accounts WHERE id = :id', 
      ['id' => $data['uid']]);
        if ($dataRef === false) {
            return false;
        }
        if ($dataRef != 0) {
            $refSum = round((($data['amount'] * 15) / 100), 2);
            $params = [
                'sum' => $refSum,
                'id' => $dataRef,
            ];
            $this->db->query('UPDATE accounts SET refBalance = refBalance + :sum WHERE id = :id', $params);

Потом по цепочке человеку на уровень выше

$dataRef2 = $this->db->column('SELECT ref FROM accounts WHERE id = :id', ['id' => $dataRef]);
                if ($dataRef2 === 0) {
                    return false;
                }
                if ($dataRef2 != 0) {
                    $refSum = round((($data['amount'] * 10) / 100), 2);
                    $params = [
                        'sum' => $refSum,
                        'id' => $dataRef2,
                    ];
                    $this->db->query('UPDATE accounts SET refBalance = refBalance + :sum WHERE id = :id', $params);

Вопрос можно ли как-то сделать это элегантнее и сократить код? А то у меня так будет 40 таких кусков, для проверки на уровень и ранг. Первый id это SESSION id реферала , который купил пакет, отправляется методом post в платежку. amount это цена тарифа тоже при покупке уходит MySQL 5v

Answer 1

Обновить вполне можно одним запросом:

update accounts A
  join (
    SELECT @id:=(select ref from accounts where id=@id) id,
           round(@amount * proc / 100, 2) amount
      FROM (
       select @amount:= :AMOUNT, @id:= :ID
      ) init, (
       select 1 N, 15 proc union all select 2, 10 union all
       select 3, 8 union all select 4, 5 union all select 5, 3
      ) P
    order by N
  ) N on A.id=N.id and N.id is not null
  set A.refBalance = A.refBalance + N.amount

Необходимо передать 2 параметра: сумму начислений и стартовый ID (его реферал первым получит отчисления). В подзапросе P задаются по порядку уровней рефералов (N) процент (proc) отчисления им.

READ ALSO
Yii2 file kit не правильно проставляет индексы

Yii2 file kit не правильно проставляет индексы

Суть вот в чём: Загружаю файлы через https://githubcom/yii2-starter-kit/yii2-file-kit На выходе получается так, что грузит все файлы, но я не могу их сохранить так...

116
Как разделить CSV файл с помощью команды split?

Как разделить CSV файл с помощью команды split?

Есть файлCSV с названием file

139
Как поставить begintransaction в очередь?

Как поставить begintransaction в очередь?

Как поставить begintransaction в очередь? Ребят, приветствуюВопрос по транзакциям: Есть скрипт, который изменяет ячейку

111
Php or Python for Web? [закрыт]

Php or Python for Web? [закрыт]

Какой язык на данный момент лучше подходит,например, для написания соцсети? Php или Python?

140