Laravel
Models Migration Relation
Introduction Installation Projet:Structure Strucutre,model,migration Migration,Models,Relation Artisan CLI Migrations:Exemples Models:Exemples Relations:Exemples 1 Relations:Exemples 2
Les Relations
BelongsTo HasOne HasMany BelongsToMany HasManyThrough
Exemples des Relations
Relations:oneToMany,ManyToMany... Relations:Exemples
Exercices
Exercice 1 Exercice 2
Controllers Views Routes
Routes,Controller,Model,view
Les Routes
Définir:Routes Routes avec Paramètres Routes nommées Groupes de routes
Les Controllers
Les Controllers Les Contrôleurs de Ressources
Les Vues
Vues et Blade Templates Blade Layouts et Sections Sous-vues Composants et Slots Contrôles de flux
MVC :CRUD
CRUD: Produit CRUD: Etudiant CRUD: Car CRUD,Recherche: Book
Validation
Exemple :Projets
ORM:Eloquent
Exemple :Transport
Api:Laravel +React
Middleware

Seeders & Factories
Exemples :EFM

Authenfication
TP:Schools Management
Authenfication:React
Layouts
Exercices





Laravel: Requêtes :scopes et conditionnelles

Laravel: Requêtes avancées avec Eloquent

Utilisation des scopes

Les scopes permettent de définir des conditions de requête réutilisables et de les appliquer facilement aux requêtes Eloquent.

Définition d'un scope

Pour définir un scope, ajoutez une méthode au modèle en préfixant son nom par scope.

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function scopePublished($query)
    {
        return $query->where('status', 'published');
    }
}

Utilisation d'un scope

Vous pouvez utiliser un scope dans vos requêtes comme suit :

Exemple :

$publishedPosts = Post::published()->get();

Requêtes conditionnelles

Les requêtes conditionnelles permettent d'ajouter des conditions dynamiques aux requêtes Eloquent.

Utilisation de la méthode when

La méthode when permet d'ajouter des conditions à une requête en fonction de l'évaluation d'un paramètre.

Exemple :

$status = 'published';

$posts = Post::when($status, function ($query, $status) {
    return $query->where('status', $status);
})->get();

Jointures et relations

Les jointures permettent de combiner les enregistrements de deux tables ou plus en fonction d'une colonne liée entre elles.

Jointure avec Eloquent

Exemple :

$posts = DB::table('posts')
    ->join('users', 'posts.user_id', '=', 'users.id')
    ->select('posts.*', 'users.name')
    ->get();

Relations Eloquent

Les relations Eloquent permettent de définir les relations entre les modèles et de les charger facilement.

Exemple de relation One-to-Many :

$user = User::find(1);
$posts = $user->posts;

Exemple de relation Many-to-Many :

$user = User::find(1);
$roles = $user->roles;

Utilisation des sous-requêtes

Les sous-requêtes permettent d'imbriquer une requête dans une autre requête pour effectuer des opérations complexes.

Exemple de sous-requête

Supposons que nous voulons récupérer les utilisateurs qui ont le plus de posts :

Exemple :

$topUsers = User::select('users.*')
    ->withCount('posts')
    ->orderBy('posts_count', 'desc')
    ->get();

Exemple de sous-requête avec where

Récupérer les posts dont le titre correspond à un certain mot clé :

Exemple :

$keyword = 'Laravel';

$posts = Post::where(function($query) use ($keyword) {
    $query->select('title')
          ->from('posts')
          ->where('title', 'LIKE', "%{$keyword}%");
})->get();

Laravel: Utilisation des Scopes avec Eloquent

Introduction

Les scopes dans Laravel Eloquent sont des méthodes qui permettent de définir des portions de requêtes réutilisables. Ils simplifient la logique des requêtes en permettant de la réutiliser dans différentes parties de votre application.

Scopes Locaux

Les scopes locaux permettent de définir des conditions spécifiques pour une requête. Ces scopes sont définis dans le modèle et peuvent être utilisés pour ajouter des conditions courantes aux requêtes.

Définition d'un Scope Local

Pour définir un scope local, ajoutez une méthode au modèle en préfixant son nom par scope. Cette méthode prend deux arguments : une instance de Builder et toute valeur de paramètre que vous souhaitez passer au scope.

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function scopePublished($query)
    {
        return $query->where('status', 'published');
    }
    
    public function scopePopular($query)
    {
        return $query->where('views', '>', 100);
    }

    public function scopeRecent($query)
    {
        return $query->orderBy('created_at', 'desc');
    }
}

Utilisation d'un Scope Local

Pour utiliser un scope local, appelez simplement la méthode scope comme une méthode Eloquent normale.

Exemple :

$publishedPosts = Post::published()->get();

$popularPosts = Post::popular()->get();

$recentPosts = Post::recent()->get();

Chaînage de Scopes Locaux

Vous pouvez chaîner plusieurs scopes locaux pour construire des requêtes complexes.

Exemple :

$popularRecentPosts = Post::popular()->recent()->get();

$publishedPopularPosts = Post::published()->popular()->get();

Scopes Globaux

Les scopes globaux permettent d'appliquer automatiquement des contraintes à toutes les requêtes pour un modèle donné. Ils sont définis en utilisant le méthode booted dans le modèle.

Définition d'un Scope Global

Pour définir un scope global, utilisez la méthode booted de votre modèle et appliquez un callback à la requête.

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class Post extends Model
{
    protected static function booted()
    {
        static::addGlobalScope('published', function (Builder $builder) {
            $builder->where('status', 'published');
        });
    }
}

Utilisation d'un Scope Global

Un scope global est automatiquement appliqué à toutes les requêtes pour le modèle. Vous pouvez également ignorer un scope global en utilisant la méthode withoutGlobalScope.

Exemple :

$posts = Post::all(); // Seulement les posts avec le statut 'published'

$allPosts = Post::withoutGlobalScope('published')->get(); // Tous les posts

Scopes Dynamiques

Les scopes dynamiques vous permettent de passer des paramètres à vos scopes pour personnaliser davantage les requêtes.

Définition d'un Scope Dynamique

Pour définir un scope dynamique, ajoutez des paramètres à la méthode du scope dans votre modèle.

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function scopeOfType($query, $type)
    {
        return $query->where('type', $type);
    }

    public function scopeFromDate($query, $date)
    {
        return $query->whereDate('created_at', '>=', $date);
    }
}

Utilisation d'un Scope Dynamique

Pour utiliser un scope dynamique, passez les paramètres nécessaires lors de l'appel de la méthode scope.

Exemple :

$newsPosts = Post::ofType('news')->get();

$recentPosts = Post::fromDate('2023-01-01')->get();

Laravel: Requêtes Conditionnelles avec Eloquent

Introduction

Les requêtes conditionnelles en Laravel Eloquent permettent d'ajouter des conditions dynamiques aux requêtes. Cela est particulièrement utile pour construire des requêtes basées sur des critères variables.

Utilisation de la Méthode when

La méthode when permet d'ajouter une condition à une requête seulement si un certain paramètre est vrai.

Condition simple

Voici comment ajouter une condition si un paramètre donné est vrai :

Exemple :

$status = 'published';

$posts = Post::when($status, function ($query, $status) {
    return $query->where('status', $status);
})->get();

Condition avec plusieurs paramètres

Vous pouvez également passer plusieurs paramètres à la méthode when :

Exemple :

$status = 'published';
$sortBy = 'created_at';

$posts = Post::when($status, function ($query, $status) {
    return $query->where('status', $status);
})->when($sortBy, function ($query, $sortBy) {
    return $query->orderBy($sortBy, 'desc');
})->get();

Condition avec une valeur par défaut

Vous pouvez aussi fournir une valeur par défaut à utiliser si la condition est fausse :

Exemple :

$status = null;

$posts = Post::when($status, function ($query, $status) {
    return $query->where('status', $status);
}, function ($query) {
    return $query->where('status', 'draft');
})->get();

Utilisation de la Méthode tap

La méthode tap permet d'exécuter une fonction sur une requête Eloquent, quel que soit l'état de la condition. Cela est utile pour des tâches telles que le logging ou le profiling.

Exemple :

$posts = Post::tap(function ($query) {
    // Logique additionnelle ici
    Log::info('Requête exécutée : ', ['query' => $query->toSql()]);
})->get();

Utilisation de Conditions Alternatives

Laravel permet également d'utiliser des conditions alternatives directement dans les méthodes de requête.

Condition dans where

Vous pouvez utiliser une condition ternaire pour simplifier la logique des requêtes :

Exemple :

$status = 'published';

$posts = Post::where('status', $status ?? 'draft')->get();

Utilisation de unless

La méthode unless fonctionne de manière similaire à when, mais exécute la condition seulement si le paramètre donné est faux.

Exemple :

$isAdmin = false;

$posts = Post::unless($isAdmin, function ($query) {
    return $query->where('status', 'published');
})->get();

Combinaison de Plusieurs Conditions

Vous pouvez combiner plusieurs conditions pour créer des requêtes complexes et dynamiques.

Exemple :

$status = 'published';
$authorId = 1;

$posts = Post::when($status, function ($query, $status) {
    return $query->where('status', $status);
})->when($authorId, function ($query, $authorId) {
    return $query->where('author_id', $authorId);
})->get();

Conclusion

Les requêtes avancées avec Laravel Eloquent permettent de manipuler les données de manière puissante et flexible. En utilisant des scopes, des requêtes conditionnelles, des jointures, des relations et des sous-requêtes, vous pouvez effectuer des opérations complexes de manière simple et intuitive.