Récupérer un utilisateur avec Eloquent

Dans ce tutoriel nous allons voir comment faire une requête SELECT avec des clauses WHERE afin de récupérer un utilisateur unique.

Création d'une page pour chaque utilisateur

Dans notre application, chaque utilisateur pourra publier des messages et les visiteurs du site pourront aller sur le profil d'un utilisateur pour voir ses messages de la même manière que Twitter.

Pour cela nous avons besoin d'une page pour chaque utilisateur et je propose de créer la page sur /thibaud@formation-laravel.fr. Donc / suivi de l'email de l'utilisateur.

Nous pouvons donc créer notre route, à la fin du fichier routes/web.php :

Route::get('/{email}', 'UtilisateursController@voir');

Nous mettons cette route à la fin du fichier, car cette route est très générique et si nous la mettons avant d'autres routes, ces routes ne seront plus accessibles.

Dans notre contrôleur, nous pouvons récupérer l'email de la personne via la fonction request().

public function voir()
{
    $email = request('email');

    // À faire, récupérer l'utilisateur en base de données et charger une vue
}

Récupérer l'utilisateur

Nous pouvons demander à Eloquent de filtrer les utilisateurs en fonction d'une colonne :

Utilisateur::where('email', $email)->get();

Ce code nous retournera une liste de tous les utilisateurs dont l'email correspond à $email. Dans notre cas, l'email est unique, nous savons que cette liste ne contiendra donc qu'un seul élément. Nous pouvons donc utiliser la fonction first() à la place de la fonction get(). Dans ce cas, Eloquent nous retournera un objet Utilisateur seul et non plus une liste.

$utilisateur = Utilisateur::where('email', $email)->first();

Création de la vue

Nous pouvons ensuite passer cette utilisateur à une vue pour l'afficher :

return view('utilisateur', [
    'utilisateur' => $utilisateur,
]);

Et la vue ressources/views/utilisateur.blade.php :

@extends('layout')

@section('contenu')
    <div class="section">
        <h1 class="title is-1">{{ $utilisateur->email }}</h1>
    </div>
@endsection