Laravel Tutoriel
3 min de lecture 431 vues

Comment obtenir l'enregistrement précédent et suivant dans Laravel

mckenziearts

Arthur Monney

@mckenziearts

Comment obtenir l'enregistrement précédent et suivant dans Laravel

Dans ce tutoriel nous allons apprendre comment obtenir les données ou l'enregistrement suivant / précédent d'un modèle dans une application Laravel.

Si vous consultez souvent les articles vous avez sûrement constaté que sur la partie gauche du site juste en dessous des informations sur l'auteur il y'a des liens article suivant et article précédent.

L'objectif était de créer deux liens, précédent et suivant, d'obtenir l'URL et le titre de l'article à partir de la table de la base de données, et de permettre aux utilisateurs visitant les articles de facilement naviguer entre chacun d'eux.

Obtenir l'enregistrement suivant

Je suppose que vous avez déjà une base de données avec une entité (Post, Category, Discussion, etc) et qu'elle contient des enregistrements. Dans notre cas nous allons utiliser la table articles. Maintenant, voici la requête Eloquent que vous pouvez utiliser pour obtenir l'enregistrement suivant d'un model

Comme vous pouvez le voir, nous avons utiliser le scope published(), et les les méthodes orderBy() et first() pour obtenir les prochains enregistrements de la base de données.

public function nextArticle(): ?Article
{
return self::published()->where('id', '>', $this->id)->orderBy('id')->first();
}

Notre scope published ressemble à ceci

/**
* Scope a query to return only published posts.
*
* @param Builder<Article> $query
* @return Builder<Article>
*/
public function scopePublished(Builder $query): Builder
{
return $query->whereDate('published_at', '<=', now())
->submitted()
->approved();
}

Obtenir l'enregistrement précédent

Pour obtenir la donnée précédente de notre Model nous encore utilisé les mêmes fonctions que dans notre fonction qui récupère l'article suivant à savoir where() et first(), à l'exception que dans ce cas au lieu d'utiliser la fonction orderBy() nous allons utiliser orderByDesc() parce qu'on veut l'entité qui vient directement après par order décroissant.

Si l'id de notre article actuel c'est 5 et que nous voulons l'article précédent nous allons chercher l'id le plus petit mais par ordre décroissant c'est à dire en allant de 4 vers 3, etc.

Le code de notre fonction va ressembler à ceci

public function previousArticle(): ?Article
{
return self::published()->where('id', '<', $this->id)->orderByDesc('id')->first();
}

Affichage dans la vue blade

Dans notre vue blade on va déjà définir nos variables $next et $previous pour les articles suivant et précédent et ensuite les afficher plus simplement dans notre vue. Le code complet donne ceci

@php
$next = $article->nextArticle();
$previous = $article->previousArticle();
@endphp
 
@if($next || $previous)
<div class="pt-6 space-y-6">
@if($next)
<div>
<h2 class="text-xs leading-5 font-medium tracking-wide uppercase text-skin-base">Article suivant</h2>
<a href="{{ route('articles.show', $next) }}" class="mt-3 flex items-start space-x-2">
<img class="h-8 w-8 object-cover shadow-lg rounded-md" src="{{ $next->getFirstMediaUrl('media') }}" alt="{{ $next->slug }}">
<span class="text-sm font-medium leading-4 text-skin-inverted hover:text-skin-primary-hover line-clamp-2">{{ $next->title }}</span>
</a>
</div>
@endif
 
@if($previous)
<div>
<h2 class="text-xs leading-5 font-medium tracking-wide uppercase text-skin-base">Article précédent</h2>
<a href="{{ route('articles.show', $previous) }}" class="mt-3 flex items-start space-x-2">
<img class="h-8 w-8 object-cover shadow-lg rounded-md" src="{{ $previous->getFirstMediaUrl('media') }}" alt="{{ $previous->slug }}">
<span class="text-sm font-medium leading-4 text-skin-inverted hover:text-skin-primary-hover line-clamp-2">{{ $previous->title }}</span>
</a>
</div>
@endif
</div>
@endif

Conclusion

Enfin, ce tutoriel est terminé et dans ce dernier, vous avez appris de manière simple comment récupérer les enregistrements suivants et précédents d'un model Eloquent votre application Laravel.

mckenziearts

Arthur Monney

@mckenziearts

Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs

Vous aimez cet article ? Faite le savoir en partageant