Bonjour à tous!
Je suis actuellement en train de travailler sur un petit projet perso pour apprendre Laravel, et je suis arrivé à me poser une question d'ordre théorique au niveau des relations:
J'aimerais créer un système de followers. Donc j'allais créer un modèle Follower, une migration etc..
Donc j'allais faire:

$table->integer('follower_id')->unsigned();
$table->foreign('follower_id')->references('id')->on('users');
$table->integer('followed_id')->unsigned();
$table->foreign('followed_id')->references('id')->on('users');

Jusque là tout va (à peu près) bien pour moi, mais mon cerveau brûle lorsqu'il s'agit d'établir les relations ensuite, dans les modèles.
Car dans le modèle User, j'aurais aimé créer la méthode:

public function followers()
{
    return $this->hasMany('App\Follower');
}

Il y a déjà un problème puisque mon modèle Follower a déjà deux clés étrangères qui référencent la table users... Il devrait donc déjà avoir un problème.

J'aurais ensuite aimé faire une méthode follows() mais là j'ai vraiment l'impression de sortir du cadre de Laravel et de faire n'importe quoi...

Voilà, alors si quelqu'un a des pistes pour me guider dans ma reflexion (qui semblera sûrement nulle à la plupart d'entre vous), je suis preneur!

Bonne jourée à tous!

5 réponses


Alexandre R.
Réponse acceptée

Salut, tu peux séparer tes clés ou leur donner des noms différents, et dans ton modèle :

public function followers()
{
    return $this->hasMany('App\Follower', 'foreign_key');
}

Ha oui ça pourrait être pas mal ça effectivement! Du coup ça me donnerait dans App\User:

public function followers()
{
    $return $this->hasMany('App\Follower','follower_id');
}
public function follows()
{
    return $this->hasMany('App\Follower','followed_id');
}

Ainsi, en invoquant un $user->followers, j'aurai la liste des followers, et en invoquant $user->follows la liste des gens que l'utilisateur suit..

Mais dans App\Follower, je suis un peu perdu.. Mais je pense enfait qu'il n'y a peut-être même pas besoin de créer la relation belongsTo? Parce qu'elle ne correspond à rien finalement non?
J'ai quand même l'impression de rater quelque chose... Suis-je en train d'utiliser les "best practices"? Enfait, j'ai tellement eu l'habitude de la "prose" Laravienne que le fait de faire une méthode follows() et ensuite de dire:

"Cet utilisateur a plusieurs Followers identifiés par le champs follower id" Alors que je veux dire ici que cet utilisateur "follows" plusieurs personnes. Je me prends peut-être la tête pour rien, rassurez-moi ou insultez moi, et en tous cas, merci Squallx pour ta réponse, qui répond finalement à ma question!

Tu peux aussi renseigner la clé locale en plus de la clé étrangère dans la méthode hasMany (ou belongsTo) ;)

C'est à dire, je ne comprends pas?

Tu précises la clé étrangère dans la table, et la clé locale dans l'autre table ;)