Laravel Résumé
Models Migration Relation
Introduction Installation Projet:Structure Strucutre,model,migration Migration,Models,Relation Artisan CLI
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
Queue,job,task
TP:Schools Management
Authenfication:React
Layouts
Exercices





Laravel: Jointures et Relations avec Eloquent

Laravel: Jointures et Relations avec Eloquent

Introduction

Laravel Eloquent facilite les jointures et les relations entre les tables. Cela permet de récupérer des données de tables liées de manière simple et efficace.

Jointures avec Eloquent

Les jointures permettent de combiner les enregistrements de deux tables ou plus en fonction d'une colonne commune entre elles. Eloquent utilise le constructeur de requêtes pour effectuer des jointures.

Jointure de base

Pour effectuer une jointure de base, utilisez la méthode join.

Exemple :

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

Jointure gauche (Left Join)

Pour inclure tous les enregistrements de la table de gauche, même s'ils n'ont pas de correspondance dans la table de droite, utilisez leftJoin.

Exemple :

$posts = DB::table('posts')
    ->leftJoin('comments', 'posts.id', '=', 'comments.post_id')
    ->select('posts.*', 'comments.content as comment_content')
    ->get();

Jointure droite (Right Join)

Pour inclure tous les enregistrements de la table de droite, même s'ils n'ont pas de correspondance dans la table de gauche, utilisez rightJoin.

Exemple :

$posts = DB::table('posts')
    ->rightJoin('comments', 'posts.id', '=', 'comments.post_id')
    ->select('posts.*', 'comments.content as comment_content')
    ->get();

Relations avec Eloquent

Les relations Eloquent définissent les relations entre les modèles. Eloquent supporte plusieurs types de relations, y compris les relations un-à-un, un-à-plusieurs, et plusieurs-à-plusieurs.

Relation Un-à-Un

Une relation un-à-un est utilisée pour définir une relation où chaque table a un seul enregistrement correspondant.

Définition de la relation

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Utilisation de la relation

Exemple :

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

$profile = Profile::find(1);
$user = $profile->user;

Relation Un-à-Plusieurs

Une relation un-à-plusieurs est utilisée pour définir une relation où un enregistrement dans une table peut avoir plusieurs enregistrements correspondants dans une autre table.

Définition de la relation

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

Utilisation de la relation

Exemple :

$post = Post::find(1);
$comments = $post->comments;

$comment = Comment::find(1);
$post = $comment->post;

Relation Plusieurs-à-Plusieurs

Une relation plusieurs-à-plusieurs est utilisée pour définir une relation où plusieurs enregistrements peuvent être liés à plusieurs enregistrements dans une autre table. Cela nécessite une table pivot.

Définition de la relation

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

Utilisation de la relation

Exemple :

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

$role = Role::find(1);
$users = $role->users;

Relation Un-à-Un Polymorphe

Les relations polymorphes permettent un modèle de relation flexible où un modèle peut appartenir à plusieurs autres modèles sur une seule association.

Définition de la relation

Exemple :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Photo extends Model
{
    public function imageable()
    {
        return $this->morphTo();
    }
}

class User extends Model
{
    public function photos()
    {
        return $this->morphMany(Photo::class, 'imageable');
    }
}

class Post extends Model
{
    public function photos()
    {
        return $this->morphMany(Photo::class, 'imageable');
    }
}

Utilisation de la relation

Exemple :

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

$post = Post::find(1);
$photos = $post->photos;

$photo = Photo::find(1);
$imageable = $photo->imageable;

Laravel: Opérateurs Eloquent pour les Jointures

Opérateur with

L'opérateur with permet de charger des relations liées à un modèle lors de la récupération de ce modèle.

Exemple :

$posts = Post::with('comments')->get();
foreach ($posts as $post) {
    echo $post->title;
    foreach ($post->comments as $comment) {
        echo $comment->content;
    }
}

Opérateur whereHas

L'opérateur whereHas permet de filtrer les modèles en fonction de la présence d'une relation spécifique.

Exemple :

$posts = Post::whereHas('comments', function ($query) {
    $query->where('status', 'approved');
})->get();

Opérateur has

L'opérateur has est similaire à whereHas, mais il ne filtre pas les résultats, il les récupère simplement.

Exemple :

$posts = Post::has('comments')->get();

Opérateur withCount

L'opérateur withCount permet de récupérer le nombre de relations liées à un modèle.

Exemple :

$posts = Post::withCount('comments')->get();
foreach ($posts as $post) {
    echo $post->title;
    echo $post->comments_count;
}

Opérateur join

L'opérateur join permet d'effectuer une jointure SQL entre deux tables.

Exemple :

$posts = DB::table('posts')
    ->join('comments', 'posts.id', '=', 'comments.post_id')
    ->select('posts.*', 'comments.content as comment_content')
    ->get();

Conclusion

Les jointures et relations en Laravel Eloquent permettent de travailler avec des bases de données de manière efficace et intuitive. En utilisant les différentes relations et types de jointures, vous pouvez facilement gérer les interactions entre les modèles et récupérer les données liées.