Formation PUB030 : Laravel, 2019 Les relations avec Eloquent ORM

22.3 belongsTo() : pour les relations 0..* vers 1 ou 0..1 vers 1


belongsTo() peut être utilisé dans une relation de un à plusieurs ou dans une relation de un à un.

Relation de un à plusieurs

Une relation de un à plusieurs indique que chaque enregistrement de la table principale (celle contenant la clé primaire) peut avoir 0, 1 ou plusieurs enregistrement dans la table secondaire (celle contenant la clé étrangère). Inversement, chaque enregistrement de la table secondaire est relié à un et exactement un enregistrement dans la table principale.

La méthode belongsTo() définit une relation de un à plusieurs dans le modèle de la table secondaire de la relation.

Par exemple, un produit appartient à une catégorie. Dans cet exemple, la table categories contient la clé primaire de la relation (id) et la table produits contient la clé étrangère de la relation (categorie_id). La relation belongsTo() sera donc définie dans le modèle de la table produits.

Schéma hasMany vs belongsTo

La relation sera définie comme suit :

Syntaxe d'une relation dans un modèle Laravel (PHP)

/**

 * Un modeleA appartient à un modeleB (ou "est associé à" ou "a").

 *

 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo

 */

public function modeleB() : BelongsTo

{

    return $this->belongsTo('App\ModeleB', 'nom_cle_etrangere', 'nom_cle_primaire');

}

Dans la plupart des cas, seul le premier paramètre sera obligatoire.

Puisque belongsTo() peut retrouver un seul enregistrement, il est d'usage de mettre le ou les mots définissant la relation au singulier.

Ex :

Modèle Laravel (PHP)

class Produit extends Model

{

    ...

 

    /**

     * Un produit appartient à une catégorie.

     *

     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo

     */

    public function categorie() : BelongsTo

    {

        return $this->belongsTo('App\Categorie');

    }

    ...

}

Par défaut, la relation sera établie entre une clé primaire nommée id (dans l'autre table) et une clé étrangère (dans la table actuelle) dont le nom est au format nomrelation_id, c'est-à-dire que son nom est formé par le nom de la fonction qui définit la relation suivi de _id (ex : categorie_id).

Ceci est confirmé dans la documentation officielle de Laravel :

Eloquent determines the default foreign key name by examining the name of the relationship method and suffixing the method name with _id.

Si, dans la table actuelle, la clé étrangère n'est pas bâtie au format nomrelation_id, il est possible de préciser son nom comme 2e paramètre (optionnel dans cet exemple).

Modèle Laravel (PHP)

return $this->belongsTo('App\Categorie', 'categorie_id');

Et si, dans l'autre table, la clé primaire ne s'appelle pas id, il est possible de préciser son nom comme 3e paramètre (optionnel dans cet exemple).

Modèle Laravel (PHP)

return $this->belongsTo('App\Categorie', 'categorie_id', 'id');

Relation de un à un

belongsTo() peut également être utilisé pour définir une relation de un à un dans le modèle de la table qui contient la clé étrangère de la relation. Voir hasOne() pour plus de détails.

Relation un à un

Utiliser la relation

Les informations de la table associée peuvent être retrouvées en appelant la méthode qui définit la relation ou encore à l'aide d'une propriété dynamique.

Ex :

Contrôleur Laravel (PHP)

$categorie = $produit->categorie()->get();

ou :

Contrôleur Laravel (PHP)

$categorie = $produit->categorie;

Requête générée

Si vous êtes intéressés à voir la requête générée par une relation belongsTo(), vous pouvez utiliser toSql().

Ex :

Contrôleur Laravel (PHP)

$categorie = Produit::find(1)->categorie()->toSql();

Un dump and die de $categorie ne nous montrera qu'une partie de ce qui a été réellement exécuté puisque deux requêtes SQL ont été réalisées : une première pour trouver le produit suivi d'une seconde pour trouver la catégorie de ce produit :

Résultat à l'écran

"select * from `categories` where `categories`.`id` = ?"

Opération inverse

Dans une relation de un à plusieurs, la relation inverse de belongsTo() est hasMany().

Dans une relation de un à un, la relation invese de belongsTo() est hasOne().

Pour plus d'information

« BelongsTo ». Laravel API. https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Relations/BelongsTo.html

« Eloquent: Relationships - One To Many (Inverse) ». Laravel. https://laravel.com/docs/master/eloquent-relationships#one-to-many-inverse

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre