Извлечение данных из одной таблицы во вложенном стиле в Laravel - PullRequest
0 голосов
/ 28 мая 2018

Меня просят загрузить данные из одной таблицы, как показано ниже:

    =================================
    |id |dept | response | created_at |
     =================================
    |1  |FO   | GOOD     | 2018-05-20 |
    |2  |FO   | GOOD     | 2018-05-20 |
    |3  |IT   | GOOD     | 2018-05-20 |
    |4  |FO   | BAD      | 2018-05-20 |
    |5  |IT   | GOOD     | 2018-05-20 |
    |6  |LO   | BAD      | 2018-05-20 |
    |7  |IT   | GOOD     | 2018-05-20 |
    |8  |IT   | GOOD     | 2018-05-21 |
    |9  |LO   | GOOD     | 2018-05-21 |
     =================================

они хотят, чтобы я отображал только записи созданные_на 2018-05-20.и желаемое отображение вывода в блейде выглядит следующим образом:

 FO
    GOOD    2
    BAD     1
 IT
    GOOD    3
    BAD     0
 LO
    GOOD    0
    BAD     1

, когда я использую команду select Different, он отображает только одну строку данных ответа (только GOOD).То же самое происходит, когда я использую groupBy

Вот мои текущие коды:

Контроллер:

$date =  new Carbon('2018-05-20');

$result = Result::select('dept', 'response')->where('created_at', '=', $date->toDateString())->groupby('dept')->get();

blade-сервер:

 @foreach($result as $result)
    {{$result->dept}}</BR>

    {{$result->response}}</br></br>
@endforeach

Вывод, который я получаю:

 FO
 GOOD    

 IT
 GOOD    

 LO
 GOOD    

Я еще не делаю count, потому что я все еще получаю этот нежелательный результат.Есть ли способ достичь желаемого запроса с этой единственной таблицей?

РЕДАКТИРОВАТЬ I: На основании ответа Yrv16's мой контроллер выглядит следующим образом:

namespace App\Http\Controllers;
use App\Result;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

public function index()
{

$date =  new Carbon('2018-05-20');

$results = Result::select('dept', 'response', \DB::raw('COUNT(*) as count'))
      ->where('created_at', '=',$date->toDateString())
      ->groupby('dept','response')              
      ->get();

$results = $results->groupBy('dept');
return view('result.index', compact ('results'));
}

и мой блейд:

@foreach($results as $result)
{{$result->dept}}</BR>

    {{$result->response}}</br></br>
@endforeach

это дает мне пустую страницу.но когда я изменяю это where('created_at', '=', $date->toDateString()) на where('created_at', '>=', $date->toDateString()), я получаю эту ошибку Property [dept] does not exist on this collection instance.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Для этого вы можете использовать манипуляции с коллекциями:

$results = Result::where('created_at', '2018-05-20')
    ->get()
    ->groupBy('dept')
    ->map(function ($item) {
        return $item->groupBy('response')->map(function ($responses) {
            return $responses->count();
        });
    });

Это даст вам следующие результаты:

print_r($results->toArray());

Array (
[FO] => Array (
        [GOOD] => 2
        [BAD] => 1
    )
[IT] => Array (
        [GOOD] => 3
    )
[LO] => Array (
        [BAD] => 1
    )
)
0 голосов
/ 28 мая 2018

Используйте groupBy для двух столбцов dept, response:

$date =  new Carbon('2018-05-20');

$results = Result::select('dept', 'response', \DB::raw('COUNT(*) as count'))
          ->where('created_at', '=',$date->toDateString())
          ->groupby('dept','response')              
          ->get();

Также сбор результатов можно groupBy('dept'), чтобы отобразить его так, как вы хотите:

$results = $results->groupBy('dept');

Клинок:

@foreach($results as $dept => $result)
    {{$dept}}</BR>
    @foreach($result as $item)
        {{$item->response}} {{ $item->count }}
    @endforeach
@endforeach
...