Recherche…


Interroger sur les relations

Eloquent vous permet également d'interroger sur des relations définies, comme indiqué ci-dessous:

User::whereHas('articles', function (Builder $query) {
    $query->where('published', '!=', true);
})->get();

Cela nécessite que le nom de votre méthode de relation soit des articles dans ce cas. L'argument transmis dans la fermeture est le Générateur de requêtes pour le modèle associé. Vous pouvez donc utiliser toutes les requêtes que vous pouvez trouver ailleurs.

Envie de chargement

Supposons que le modèle Utilisateur ait une relation avec le modèle Article et que vous souhaitez charger les articles associés. Cela signifie que les articles de l'utilisateur seront chargés lors de la récupération de l'utilisateur.

articles est le nom de la relation (méthode) dans le modèle utilisateur.

User::with('articles')->get();

si vous avez plusieurs relations. par exemple des articles et des articles.

User::with('articles','posts')->get();

et pour sélectionner des relations imbriquées

User::with('posts.comments')->get();

Appeler plusieurs relations imbriquées

User::with('posts.comments.likes')->get()

Insertion de modèles associés

Supposons que vous ayez un modèle Post avec une relation hasMany avec Comment . Vous pouvez insérer un objet Comment associé à une publication en procédant comme suit:

$post = Post::find(1);

$commentToAdd = new Comment(['message' => 'This is a comment.']);

$post->comments()->save($commentToAdd);

Vous pouvez enregistrer plusieurs modèles à la fois en utilisant la fonction saveMany :

$post = Post::find(1);

$post->comments()->saveMany([
    new Comment(['message' => 'This a new comment']),
    new Comment(['message' => 'Me too!']),
    new Comment(['message' => 'Eloquent is awesome!'])
]);

Il existe également une méthode create qui accepte un tableau PHP simple au lieu d'une instance de modèle Eloquent.

$post = Post::find(1);

$post->comments()->create([
    'message' => 'This is a new comment message'
]);

introduction

Les relations éloquentes sont définies comme des fonctions sur vos classes de modèles Eloquent. Étant donné que, tout comme les modèles Eloquent eux-mêmes, les relations servent également de puissants générateurs de requêtes, la définition de relations en tant que fonctions fournit de puissantes fonctions de chaînage et d'interrogation de méthodes. Par exemple, nous pouvons enchaîner des contraintes supplémentaires sur cette relation d'articles:

$user->posts()->where('active', 1)->get();

Naviguer vers le sujet parent

Types de relation

Un à plusieurs

Disons que chaque message peut avoir un ou plusieurs commentaires et chaque commentaire appartient à un seul message.

donc la table de commentaires aura post_id . Dans ce cas, les relations seront les suivantes.

Post modèle

public function comments()
{
   return $this->belongsTo(Post::class);
}

Si la clé étrangère est autre que post_id , par exemple la clé étrangère est example_post_id .

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id');
}

et plus, si la clé locale est autre que id , par exemple la clé locale est other_id

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id', 'other_id');
}

Modèle de commentaire

définition inverse de un à plusieurs

public function post()
{
   return $this->hasMany(Comment::class);
}

Un par un

Comment associer deux modèles (exemple: modèle User et Phone )

App\User

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('Phone::class', 'foreign_key', 'local_key');
    }
}

App\Phone

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('User::class', 'foreign_key', 'local_key');
    }
}

foreign_key : Par défaut, Eloquent supposera que cette valeur est other_model_name_id (dans ce cas, user_id et phone_id ), modifiez-le si ce n'est pas le cas.

local_key : Par défaut, Eloquent supposera que cette valeur est id (clé primaire du modèle actuel), modifiez-la si ce n'est pas le cas.

Si votre nom de base de données est déposé conformément au standard Laravel, vous n'avez pas besoin de fournir de déclaration de clé étrangère et de clé locale dans la relation

Explication

Plusieurs à plusieurs

Disons qu'il y a des rôles et des autorisations. Chaque rôle peut appartenir à de nombreuses autorisations et chaque autorisation peut appartenir à plusieurs rôles. il y aura donc 3 tables. deux modèles et un tableau pivotant. une table roles , users et permission_role .

Modèle

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

Modèle d'autorisation

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

Note 1

envisagez de suivre tout en utilisant un nom de table différent pour le tableau croisé dynamique.

Supposons que vous souhaitiez utiliser role_permission au lieu de permission_role , car eloquent utilise l'ordre alphabétique pour construire les noms de clés pivot. Vous devrez passer le nom du tableau croisé comme second paramètre comme suit.

Modèle

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

Modèle d'autorisation

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

Note 2

envisagez de suivre tout en utilisant différents noms de clés dans le tableau croisé dynamique.

Eloquent suppose que si aucune clé n'est passée en troisième et quatrième paramètres, ce seront les noms de table singulier avec _id . il suppose donc que le pivot aura les champs role_id et permission_id . Si des clés autres que celles-ci doivent être utilisées, elles doivent être transmises en troisième et quatrième paramètres.

Disons que other_role_id au lieu de role_id et other_permission_id au lieu de permission_id doivent être utilisés. Ce serait donc comme suit.

Modèle

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

Modèle d'autorisation

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

Polymorphe

Les relations polymorphes permettent à un modèle d'appartenir à plusieurs autres modèles sur une même association. Un bon exemple serait les images, à la fois un utilisateur et un produit peuvent avoir une image. La structure de la table peut ressembler à ceci:

user
    id - integer
    name - string
    email - string

product
    id - integer
    title - string
    SKU - string

image
    id - integer
    url - string
    imageable_id - integer
    imageable_type - string

Les colonnes importantes à examiner se trouvent dans le tableau des images. La colonne imageable_id contiendra la valeur d'ID de l'utilisateur ou du produit, tandis que la colonne imageable_type contiendra le nom de la classe du modèle propriétaire. Dans vos modèles, vous configurez les relations comme suit:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    /**
     * Get all of the owning imageable models.
     */
    public function imageable()
    {
        return $this->morphTo();
    }
}

class User extends Model
{
    /**
     * Get all of the user's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

class Product extends Model
{
    /**
     * Get all of the product's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

Vous pouvez également récupérer le propriétaire d'une relation polymorphe à partir du modèle polymorphe en accédant au nom de la méthode qui effectue l'appel à morphTo . Dans notre cas, c'est la méthode imageable sur le modèle Image. Nous allons donc accéder à cette méthode en tant que propriété dynamique

$image = App\Image::find(1);

$imageable = $image->imageable;

Cet imageable renverra un utilisateur ou un produit.

Plusieurs à plusieurs

Disons qu'il y a des rôles et des autorisations. Chaque rôle peut appartenir à de nombreuses autorisations et chaque autorisation peut appartenir à plusieurs rôles. il y aura donc 3 tables. deux modèles et un tableau pivotant. une table roles , users et permission_role .

Modèle

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

Modèle d'autorisation

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

Note 1

envisagez de suivre tout en utilisant un nom de table différent pour le tableau croisé dynamique.

Supposons que vous souhaitiez utiliser role_permission au lieu de permission_role , car eloquent utilise l'ordre alphabétique pour construire les noms de clés pivot. Vous devrez passer le nom du tableau croisé comme second paramètre comme suit.

Modèle

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

Modèle d'autorisation

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

Note 2

envisagez de suivre tout en utilisant différents noms de clés dans le tableau croisé dynamique.

Eloquent suppose que si aucune clé n'est passée en troisième et quatrième paramètres, ce seront les noms de table singulier avec _id . il suppose donc que le pivot aura les champs role_id et permission_id . Si des clés autres que celles-ci doivent être utilisées, elles doivent être transmises en troisième et quatrième paramètres.

Disons que other_role_id au lieu de role_id et other_permission_id au lieu de permission_id doivent être utilisés. Ce serait donc comme suit.

Modèle

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

Modèle d'autorisation

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

Accéder à la table intermédiaire avec withPivot ()

Supposons que vous avez une troisième colonne ' permission_assigned_date ' dans le tableau croisé dynamique. Par défaut, seules les clés de modèle seront présentes sur l'objet pivot. Maintenant, pour obtenir cette colonne dans le résultat de la requête, vous devez ajouter le nom avec la fonction withPivot ().

   public function permissions()
        {
           return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
        }

Fixation / Détachement

Eloquent propose également quelques méthodes d'aide supplémentaires pour faciliter le travail avec les modèles associés. Par exemple, imaginons qu'un utilisateur puisse avoir plusieurs rôles et qu'un rôle puisse avoir de nombreuses autorisations. Pour associer un rôle à une autorisation en insérant un enregistrement dans la table intermédiaire qui joint les modèles, utilisez la méthode attach:

$role= App\Role::find(1);    
$role->permissions()->attach($permissionId);

Lorsque vous associez une relation à un modèle, vous pouvez également transmettre un tableau de données supplémentaires à insérer dans la table intermédiaire:

$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);

De même, pour supprimer une autorisation spécifique pour un rôle, utilisez la fonction de détachement

$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);

Associations de synchronisation

Vous pouvez également utiliser la méthode sync pour construire des associations plusieurs-à-plusieurs. La méthode sync accepte un tableau d'ID à placer sur la table intermédiaire. Tout identifiant qui ne figure pas dans le tableau donné sera supprimé de la table intermédiaire. Ainsi, une fois cette opération terminée, seuls les ID du tableau donné existeront dans la table intermédiaire:

//will keep permission id's 1,2,3 against Role id 1

$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow