Retour aux articles

Cet article a été publié à l'origine sur Laravel Cameroun

Lire l'article original

Laravel Eloquent

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

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