Уникальное значение таблицы для просмотра laravel 5.4 - PullRequest
0 голосов
/ 07 октября 2018

У меня есть таблица, подобная приведенной ниже, и я использовал eloquent для получения всех данных, основанных на ключе, на моем контроллере

моя таблица содержит дублирование в столбце Error, также столбец Factor

Error    Factor    Attribute    PK_ID
X1        YY        Att1          1
X1        YY        Att2          2 
X1        YY        Att3          3 
X2        ZZ        Att4          4 
X4        ZZ        Att5          5 

в моемКонтроллер, который я использовал ниже, код пытался получить уникальное значение

$Error = table::where('id', '=', $id)
->orderBy('ErrorCol')
->orderBy('FactorCol')
->get();

$errorForView = [];
$first = true;
$errorKey = $factorKey = 0;
foreach($Error as $row) {
$currentError = $row->ErrorCol;
$currentFactor = $row->FactorCol;
if($first) {
    $prevError = $currentError;
    $prevFactor = $currentFactor;
    $first = false;
}
if($currentError !== $prevError) {
    $errorKey++;
}
if($currentFactor !== $prevFactor) {
    $factorKey++;
}
$errorForView[$errorKey]['error'] = $currentError;
$errorForView[$errorKey]['factors'][$factorKey]['factor'] = $currentFactor;
$errorForView[$errorKey]['factors'][$factorKey]['attributes'][] = $row- 
>AttributeCol;
$prevError = $currentError;
$prevFactor = $currentFactor;
}
return view('view')->with('errorForView',$errorForView);

Мне нужно повторить приведенный ниже блок кода

<h6>unique Error</h6>
  <h5>unique Factor</h5>
   <ul>
      <li>each value of attribute based on factor column</li>
      <li>each value of attribute based on factor column</li>
      <li>each value of attribute based on factor column</li>
   </ul>

, поэтому я попытался использовать для каждого из них следующую логику

 @foreach($errorForView as $error)
<h5>{{$error['error']}}</h5>
@foreach($error['factors'] as $factor)
    <h6>{{$factor['factor']}}</h6>
    <ul>
    @foreach($factor['attributes'] as $attr)
        <li>{{$attr}}</li>
    @endforeach
    </ul>
  @endforeach
@endforeach

но я обнаружил, что приведенный ниже результат X1 Имя ошибки дублировано, поэтому как получить Ошибка с каждым связанным фактором и атрибутами, даже если имя ошибки дублируется

  <h6>X1</h6>
  <h6>X1</h6>
  <h6>X1</h6>
    <h5>YYY</h5>
    <h5>YYY</h5>
    <h5>YYY</h5>
      <ul>
        <li>Att1</li>
        <li>Att2</li>
        <li>Att3</li>
     </ul>
  <h6>X2</h6>
    <h5>ZZ</h5>
      <ul>
        <li>Att4</li>
     </ul>
  <h6>X4</h6>
    <h5>ZZ</h5>
      <ul>
        <li>Att5</li>
     </ul>

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Вы можете подумать о корректировке модели базы данных, но вот один из способов сделать это с текущей настройкой:

// order is important for this to work ...
$Error = table::where('id', '=', $id)
    ->orderBy('ErrorCol')
    ->orderBy('FactorCol')
    ->get();

$errorForView = [];
$first = true;
$errorKey = $factorKey = 0;
foreach($Error as $row) {
    $currentError = $row->ErrorCol;
    $currentFactor = $row->FactorCol;
    if($first) {
        $prevError = $currentError;
        $prevFactor = $currentFactor;
        $first = false;
    }
    if($currentError !== $prevError) {
        $errorKey++;
    }
    if($currentFactor !== $prevFactor) {
        $factorKey++;
    }
    $errorForView[$errorKey]['error'] = $currentError;
    $errorForView[$errorKey]['factors'][$factorKey]['factor'] = $currentFactor;
    $errorForView[$errorKey]['factors'][$factorKey]['attributes'][] = $row->AttributeCol;
    $prevError = $currentError;
    $prevFactor = $currentFactor;
}
return view('view')->with('errorForView',$errorForView);

Это было несколько уродливо, но, по вашему мнению, что-то более простое:

@foreach($errorForView as $error)
    <h6>{{$error['error']}}</h6>
    @foreach($error['factors'] as $factor)
        <h5>{{$factor['factor']}}</h5>
        <ul>
        @foreach($factor['attributes'] as $attr)
            <li>{{$attr}}</li>
        @endforeach
        </ul>
    @endforeach
@endforeach

С предоставленными вами данными это должно привести к:

<h6>X1</h6>
    <h5>YY</h5>
    <ul>
        <li>Att1</li>
        <li>Att2</li>
        <li>Att3</li>
    </ul>
<h6>X2</h6>
    <h5>ZZ</h5>
    <ul>
        <li>Att4</li>
    </ul>
<h6>X4</h6>
    <h5>ZZ</h5>
    <ul>
       <li>Att5</li>
   </ul>
0 голосов
/ 07 октября 2018

Я думаю, что вам нужен многоуровневый сгруппированный массив.

Контроллер

$first_level_grouped_erros = table::where('id', $id)->get()->groupBy->ErrorCol;

$final_array = collect();

foreach($first_level_grouped_erros as $errors) {

    $second_level_geouped_errors = $errors->groupBy->FactorCol;

    $final_array->put($errors->first()->ErrorCol, $second_level_geouped_errors);
}

return view('view')->with('errorForView',$final_array);

Просмотр

@foreach($final_array as $error_name => $name_group)

    <h6>{{ $error_name }}</h6>

    @foreach($name_group as $factor_name => $factor_group)

        <h5>{{ $factor_name }}

        @foreach($factor_group as $error)

        <li>{{ $error->AttributeCol }}</li>
        <!-- here AttributeCol is an example. there the the Complete Error Object here. print whatever you want. -->

        @endforeach

    @endforeach

@endforeach
0 голосов
/ 07 октября 2018

Это будет немного некрасиво.Вы должны помнить «текущее» значение каждого из заголовков, а затем выводить только при его изменении.Что-то вроде:

@php $h6 = '';@endphp
@php $h5 = '';@endphp
@foreach($Error as $err)
    @if ($h6 != $Error->ErrorCol)
        <h6>{{$Error->ErrorCol}}</h6>
        @php $h6 = $Error->ErrorCol;@endphp
    @endif
    @if ($h5 != $Error->FactorCol)
        <h5>{{$Error->FactorCol}}</h5>
        @php $h5 = $Error->FactorCol;@endphp
    @endif
    <ul>
        <li>{{$Error->AttributeCol}}</li>
    </ul>
@endforeach

Не совсем так, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...