2017-07-12 1 views
0

I ont les tableaux suivantsLaravel 5. * - Eloquent Beaucoup de nombreuses relations

USERS = username | email | name 
FOLLOWERS = user_id | follower_id 

Lorsqu'un connecté utilisateur clique sur « suivre » mon code sauve sa carte d'identité à l'intérieur followers.follower_id, et l'identifiant de l'utilisateur qui il veut suivre est enregistré à l'intérieur followers.user_id.

Pour voir combien de disciples un utilisateur et le nombre d'utilisateurs d'un utilisateur suit j'utilise:

$followers = Follower::where('user_id', $user->id)->count(); 
$following = Follower::where('follower_id', $user->id)->count(); 

Cela fonctionne bien, mais je voudrais montrer des informations sur les adeptes d'un utilisateur. J'ai essayé ce qui suit:

$first_follower = $followers[0]->user->username; 

Mais il retourne l'utilisateur suivi pas le suiveur.

Je me demande comment je peux obtenir des informations sur le suiveur

Modèle utilisateur

protected $fillable = ['username','email','name']; 

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

Suiveur Modèle

protected $fillable = ['user_id','follower_id']; 

public function user() { 
    return $this->belongsTo('Shop\User'); 
} 
+0

vous devriez utiliser plusieurs à plusieurs relations pour surmonter cette –

Répondre

0

Si je reçois ce droit les disciples sont des instances de la classe/modèle User, vous n'avez donc pas besoin d'un modèle Follower. Vous pouvez simplement définir un Many To Many Relationship

Dans votre modèle d'utilisateur, vous pouvez ajouter:

public function followers() 
{ 
    return $this->belongsToMany('Shop\User', 'followers', 'user_id ', 'follower_id'); 
} 

public function following() 
{ 
    return $this->belongsToMany('Shop\User', 'followers', 'follower_id', 'user_id'); 
} 

Que vous pouvez accéder aux adeptes de l'utilisateur que par $user->followers qui retournera un Laravel Collection et $user->following vous pouvez accéder à ceux que le l'utilisateur suit.

//Get the count of all followers for $user 
$count = $user->followers()->count(); 

//Get the count of all followed by $user 
$count = $user->following()->count(); 

//Get the username of the first follower 
$follower = $user->followers()->first(); 
echo $follower->username; 

//Loop trough all followers 
foreach ($user->followers as $follower) { 
    echo $follower->username; 
} 

Définir cette relation peut vous aider à/supprimer adeptes en utilisant simplement les attach() et detach() méthodes

// The $user will be followed by an user with $followerId 
// A record in the `followers` table will be created with 
// user_id = $user->id and follower_id = $followerId 
$user->followers()->attach($followerId); 

// The $user will stop be followed by an user with $followerId 
$user->followers()->detach($followerId); 

Une note de côté: Il y a une différence entre appeler la méthode followers() et appelant la propriété followers. La première sera de retour BelongsToMany relation et vous pouvez appeler toute la méthode de générateur de requêtes Eloquent sur et le plus tard retournera un Collection

/** @var Illuminate\Support\Collection */ 
$user->followers; 

/** @var Illuminate\Database\Eloquent\Relations\BelongsToMany */ 
$user->followers(); 
0

Un exemple comment vous devez mettre en œuvre les relations, est au-dessus. C'est beaucoup d'utilisateurs à de nombreux utilisateurs à travers la table des suiveurs. Vous n'avez probablement pas besoin d'un modèle suiveur, car vous avez déjà un modèle utilisateur.Votre code fonctionnera après quelques Analysons et des améliorations, mais je fortement recommanderai de faire quelque chose comme ce modèle inuser à la place:

public function followers() { return $this->belongsToMany('App\User','followers','user_id','follower_id'); } public function following_users() { return $this->belongsToMany('App\User','followers','follower_id','user_id'); }

Que vous pouvez accéder à un suiveurs $user->followers (ce sera de retour collection éloquente et vous serez en mesure de faire ce que vous voulez avec cela selon larvar docs collection api) et un certain comme $user->followers[0]

J'espère que votre réponse sera correcte.