Laravel - Query Builder - Группировка по значению столбца - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующая таблица:

Schema::create('rounds', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('color');
    $table->integer('random');
    $table->timestamps();
});

Мне нужно вернуть его сгруппированные по цвету, но несколько групп, не только по одному из каждого цвета.

Я попытался представить способ возврата моего массива:

enter image description here

Существует три цвета, а группировка представлена ​​красным цветом.

В качестве примера я использую первые 6 элементов изображения. Первые 6 элементов изображения должны быть отформатированы следующим образом:

[
  {
    "color": 4,
    "rounds": [
      {
        "random": 12
      }
    ]
  },
  {
    "color": 3,
    "rounds": [
      {
        "random": 32
      }
    ]
  },
  {
    "color": 1,
    "rounds": [
      {
        "random": 56
      },
      {
        "random": 27
      }
    ]
  },
  {
    "color": 4,
    "rounds": [
      {
        "random": 12
      }
    ]
  },
  {
    "color": 3,
    "rounds": [
      {
        "random": 32
      }
    ]
  }
]

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

ДБ запрос:

DB::table('rounds')
     ->select('*')
     ->groupBy('color')
     ->get();

Красноречивый:

Rounds::select('*')
   ->groupBy('color')
   ->get();
0 голосов
/ 01 ноября 2018

Вам потребуется обновить схему таблицы:

Schema::create('groups', function (Blueprint $table) { //renamed to groups for better understanding. See each set of randoms as one group having a color (3,4,etc)
    $table->increments('id');
    $table->integer('color');
    $table->timestamps();
});

Schema::create('rounds', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('group_id');
    $table->integer('random');
    $table->timestamps();
});

Вам придется хранить его сгруппированным, чтобы получить его как группу.

Создать отношение hasMany из групп к раундам.

Затем получите доступ к данным, используя:

Группы :: OrderBy ( 'порядок') -> с ( 'раундов') -> получить ();

Тогда foreach для ваших групп в поле зрения.

Пример записи в БД: Таблица групп Пример таблицы данных группы Стол раундов образец данных круглого стола

Если у вас есть записи в порядке:

    use Illuminate\Support\Facades\DB;
    public function randoms()
    {
        $allrows = DB::table('rounds')->get();
        $returnarray = [];
        $randoms = [];
        $thiscolor= false;
        foreach ($allrows as $row) {
            if ($row->color != $thiscolor) {
                $thiscolor = $row->color;//save current color reference
                if (isset($randoms['color'])) {//has value
                  $returnarray[] = $randoms;
                } // save previous value to jsonarray
                $randoms=[];//cleat $randoms
                $randoms['color'] = $row->color; // save color
                $randoms['rounds'][]['random'] = $row->random;//save this round
            } else {
                $randoms['rounds'][]['random'] = $row->random;//save round to previous color
            }
        }
        $returnarray[] = $randoms;
        return json_encode($returnarray);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...