Laravel: порядок по дате сводной таблицы - PullRequest
0 голосов
/ 26 апреля 2020

У меня проблема с моими запросами, и я не могу ее решить. У меня есть две модели:

Пользователь

public function episodes()
{
    return $this->belongsToMany(Episode::class, 'user_episode_view', 'user_id', 'episode_id')
        ->withTimestamps()
        ->orderBy('user_episode_view.created_at', 'asc');;
}

Эпизод

public function users()
{
    return $this->belongsToMany(User::class, 'user_episode_view', 'episode_id', 'user_id');
}

В моей сводной таблице есть метки времени, и я хотел бы, на мой взгляд, отсортировать $ user- > Эпизоды от made_at. Моя проблема в том, что иногда пользователь видел два или три эпизода в один и тот же день, поэтому я хотел бы показать встроенное представление трех эпизодов следующим образом:

<h4>The created_at data to show the date</h4>
<p>Episode 1</p>
<p>Episode 2</p>
<p>Episode 3</p>

<h4>The other created_at data to show the date</h4>
<p>Episode 1</p>

<h4>Yet another created_at data to show the date</h4>
<p>Episode 1</p>
<p>Episode 2</p>
<p>Episode 3</p>

Это код моего контроллера:

public function historique($id)
{
    $user = User::where('id', $id)
        ->with(['episodes' => function ($query) {
            $query->orderBy('created_at', 'desc');
        }])
        ->first();

    return view('front.profils.historiques', compact('user'));
}

В моем виде лезвия у меня есть это:

<div class="index-tops">
    @foreach ($user->episodes as $episode)
        {{$episode->created_at}}
        <div class="wrap-tops mb-2">

            <a href="">{{$episode->name}} <br>Diffusé le : {{$episode->programmation->date}}</a>

            <br>
            {{$episode->created_at}}
        </div>

    @endforeach
</div>

Я не знаю, ясно ли это, но это сводит меня с ума -_- '

1 Ответ

0 голосов
/ 26 апреля 2020

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

$user = User::where('id', $id)
    ->with(['episodes' => function ($query) {
        $query->orderBy('user_episode_view.created_at', 'desc');
    }])
    ->first();

Согласно документации (прокрутите вниз до Получение промежуточных столбцов таблицы ), если вы хотите показать дату created_at для сводной таблицы, вы можете использовать атрибут pivot:

$episode->pivot->created_at;

Вам также необходимо добавить withTimestamps() метод ваших отношений:

public function users()
{
    return $this->belongsToMany(User::class, 'user_episode_view', 'episode_id', 'user_id')
        ->withTimestamps();
}
<div class="index-tops">
    @foreach ($user->episodes as $episode)
        {{$episode->pivot->created_at}}
        ...
    @endforeach
</div>

Если вы хотите сгруппировать эпизоды по дате, вы можете использовать метод groupBy () для коллекция эпизодов (обратите внимание, что это не то же самое, что метод groupBy в построителе запросов).

Во-первых, измените метод контроллера следующим образом:

public function historique($id)
{
    $user = User::findOrFail($id);

    $episodes = $user->episodes()
        ->orderBy('user_episode_view.created_at', 'desc')
        ->get()
        ->groupBy(function ($episode) {
            return $episode->pivot->created_at->toString();
        });

    return view('front.profils.historiques', compact('user', 'episodes'));
}

Затем измените свой блейд вид:

<div class="index-tops">
    @foreach ($episodes as $date => $group)

        <p>{{ $date }}</p>


        @foreach ($group as $episode)
           ...
        @endforeach
    @endforeach
</div>

Если вы хотите отформатировать $date по-другому, вы можете либо изменить его в методе groupBy в вашем контроллере и использовать переменную $date, как показано выше Например:

->groupBy(function ($episode) {
    return $episode->pivot->created_at->format('jS F Y');
})

или вы можете получить первую запись в вашем клинке файл и формат, который:

<div class="index-tops">
    @foreach ($episodes as $date => $group)

        <p>{{ $group->first()->created_at->format('jS F Y') }}</p>


        @foreach ($group as $episode)
           ...
        @endforeach
    @endforeach
</div>

Для получения дополнительной информации о том, как вы можете отформатировать даты, вы можете обратиться к PHP документация даты .

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