belongsTo() peut être utilisé dans une relation de un à plusieurs ou dans une relation de un à un.
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.

La relation sera définie comme suit :
/**
* 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 :
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).
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).
return $this->belongsTo('App\Categorie', 'categorie_id', 'id');
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.

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 :
$categorie = $produit->categorie()->get();
ou :
$categorie = $produit->categorie;
Si vous êtes intéressés à voir la requête générée par une relation belongsTo(), vous pouvez utiliser toSql().
Ex :
$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 :
"select * from `categories` where `categories`.`id` = ?"
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().
« 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é