Laravel покажите «многие ко многим» с Pivot in Blade - PullRequest
0 голосов
/ 20 мая 2019

Справочная информация:

У меня есть сводная таблица с лекарственными препаратами, пациент с днем ​​элемента, время, данные, данные и блокировка.Пример:

id       medication_id          patient_id         Day      time      given 
1         1 (MED X)             1 (Patient X)    Yesterday  0900        1
2         1 (MED X)             1 (Patient X)    Yesterday  1200        1
3         1 (MED X)             1 (Patient X)    Today      0900        0
4         2 (MED Y)             1 (Patient X)    Tomorrow   1200        0
5         2 (MED Y)             1 (Patient X)    Yesterday  0900        1
6         1 (MED X)             2 (Patient Y)    Yesterday  1200        1
7         1 (MED X)             2 (Patient Y)    Yesterday  0900        1
8         3 (MED Z)             2 (Patient Y)    Yesterday  1200        0

Пациент может принимать одно и то же лекарство, но несколько раз в течение одного дня.Допустим, у пациента X был Med X вчера в 09:00 и 1200 г., сегодня в 09:00, но не завтра.

Чтобы увидеть все лекарства, назначенные пациенту X

$assignedMeds = $patient->medication()->get();

И передал его в поле зрения.

Сейчас у меня есть

@if(isset($assignedMeds))
    <div class="card-body">
        <table class="table table-hover">
            <tbody>
                <tr>
                    <th>Name</th>
                    <th>Yesterday</th>
                    <th>Today</th>
                    <th>Tomorrow</th>
                </tr>
                @foreach($assignedMeds as $assignedMed)
                    <tr>
                        <td>{{$assignedMed->name}}</td>
                        <td>
                            @if(($assignedMed->pivot->day) == 'yesterday')
                                @if($assignedMed->pivot->given)
                                    <i class="fas fa-check green"></i>
                                    <strike>{{$assignedMed->pivot->time}}</strike>
                                    <em>{{$assignedMed->pivot->givenby}}</em>
                                @else
                                    {{$assignedMed->pivot->time}}
                                @endif
                            @endif
                        </td>
                        <td>
                            @if(($assignedMed->pivot->day) == 'today')
                                @if($assignedMed->pivot->given)
                                    <i class="fas fa-check green"></i>
                                    <strike>{{$assignedMed->pivot->time}}</strike>
                                    <em>{{$assignedMed->pivot->givenby}}</em>
                                @else
                                    <form method="post" action="/mar/{{$assignedMed->id}}">
                                        @csrf
                                        @method('PATCH')
                                        <input hidden name="givenby" id="givenby" value="1">
                                        <button>{{$assignedMed->pivot->time}}</button>
                                    </form>
                                @endif
                            @endif
                        </td>
                        <td>
                            @if(($assignedMed->pivot->day) == 'tomorrow')
                                {{$assignedMed->pivot->time}}
                            @endif
                        </td>
                    </tr>
                @endforeach
            </tbody>
        </table>
    </div>
@endif

И это дает мне

Medication Name        Yesterday        Today         Tomorrow 
    Med X              0900 Given      
    Med X                                0900
    Med X              1200 Given
    Med Y              0900 Given  
    Med Y                                                0900

Что я ищу

То, что я пытаюсь получить, - это отобразить название лекарства один раз и показатьвремя в нем.

Пример для пациента X

Medication Name        Yesterday        Today         Tomorrow 
Med X                   0900 Given      0900
                        1200 Given
Med Y                   0900 Given                     0900

1 Ответ

1 голос
/ 20 мая 2019

Вы можете использовать groupBy() и where() Методы сбора в вашем @foreach.Это должно выглядеть так:

<!-- $index will be the 'name' we grouped by (medication name) -->
@foreach($assignedMeds->groupBy('name') as $index => $assignedMed)
<tr>
    <!-- medication name -->
    <td>{{ $index }}</td>
    <!-- yesterday's medications -->
    <td>
        @foreach($assignedMed->where('pivot.day', 'Yesterday') as $yesterdaysMeds)
            @if($yesterdaysMeds->pivot->given)
                <i class="fas fa-check green"></i>
                <strike>{{$yesterdaysMeds->pivot->time}}</strike>
                <em>{{$yesterdaysMeds->pivot->givenby}}</em>
            @else
                {{$yesterdaysMeds->pivot->time}}
            @endif
            <!-- line break -->
            <br>
        @endforeach
    </td>
    <!-- today's medications -->
    <td>
        @foreach($assignedMed->where('pivot.day', 'Today') as $todaysMeds)
            @if($todaysMeds->pivot->given)
                <i class="fas fa-check green"></i>
                <strike>{{$todaysMeds->pivot->time}}</strike>
                <em>{{$todaysMeds->pivot->givenby}}</em>
            @else
                <form method="post" action="/mar/{{$todaysMeds->id}}">
                    @csrf
                    @method('PATCH')
                    <input hidden name="givenby" id="givenby" value="1">
                    <button>{{$todaysMeds->pivot->time}}</button>
                </form>
            @endif
            <!-- line break -->
            <br>
        @endforeach
    </td>
    <!-- tomorrow's medications -->
    <td>
        @foreach($assignedMed->where('pivot.day', 'Tomorrow') as $tomorrowsMeds)
            {{ $tomorrowsMeds->pivot->time }}
            <!-- line break -->
            <br>
        @endforeach
    </td>
</tr>
@endforeach
...