Salut a tous! et avant de commencer je remercie d'avance les courageux qui liront jusqu'a la fin!
Alors voila j'ai un comportement que je trouve bizarre ou que je n'arrive pas a comprendre sur laravel 5.1 et Tinker.
Quand j'utilise tinker j'ai l'impression qu'il garde en mémoire des données des requêtes précédentes, je m'explique:
J'ai un système d'amis et 3 getters (pendingFriends, friends et blockedFriends)
Quand je les teste sur tinker, je récupère toujours un user ($u1) et j'appelle ces méthodes dessus. La première marche toujours mais les autres me retournent toujours le résultat du premier getter exécuté.
Par exemple j'ai:
- 2 amis acceptés (Joey Belladonna et Tom Araya)
- 1 ami en pending (James Hetfield)
- 1 bloqué (Corey Taylor)
et quand j'utilise Tinker:
- le premier appel de n'importe quel getter me retourne bien ce qu'il faut
- l'appel de n'importe quel getter ensuite me retournera le resultat du premier et je suis obligé de quitter tinker et le relancer pour que ca marche (mais uniquement pour le premier appel a chaque fois)
Je fournirai un print de tinker si vous me le demandez =)
voici mon code:
function friendsOfMine(){
return $this->belongsToMany('App\User', 'relationships', 'user_id', 'friend_id')
->withPivot('state');
}
function friendOf(){
return $this->belongsToMany('App\User', 'relationships', 'friend_id', 'user_id')
->withPivot('state');
}
public function getFriendsAttribute(){
if ( ! array_key_exists('relationships', $this->relations)) $this->loadFriends(FriendshipStates::ACCEPTED);
return $this->getRelation('relationships');
}
public function getPendingFriendsAttribute(){
if ( ! array_key_exists('relationships', $this->relations)) $this->loadFriends(FriendshipStates::PENDING);
return $this->getRelation('relationships');
}
public function getBlockedFriendsAttribute(){
if ( ! array_key_exists('relationships', $this->relations)) $this->loadFriends(FriendshipStates::BLOCKED);
return $this->getRelation('relationships');
}
protected function loadFriends($state){
if ( ! array_key_exists('relationships', $this->relations)){
$friends = $this->mergeFriends($state);
$this->setRelation('relationships', $friends);
}
}
protected function mergeFriends($state){
return $this->friendsOfMine()->wherePivot('state', '=', $state)->get()
->merge($this->friendOf()->wherePivot('state', '=', $state)->get());
}