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());
}

4 réponses


Benares
Auteur
Réponse acceptée

Je viens de trouver mon problème, en supprimant le test

if ( ! array_key_exists('relationships', $this->relations))

de chaque méthode je récupère bien les bons résultats

Par contre je ne vois pas ce que fait ce test (ce n'est pas moi qui l'ai codé), est ce que quelqu'un saurais a quoi correspond cette ligne de manière générale? =)

Azorgh
Réponse acceptée

La fonctionne array_key_exists te permet de vérifier (dans ton cas) si la clé "relationships" existe bien dans $this->relations.
Ce qui est un peu bizzare quand même je trouve, puisqu'un objet pourrait avoir plusieurs relations, donc plusieurs entrées dans $this->relations->relashionships.

La première cause de bug se trouve généralement entre la chaise et le clavier ^^

Benares
Auteur

Ok merci PallMallShow

@betaWeb Et oui les problèmes d'interfaces chaises-clavier sont plutot chiants, surtout que personne n'a encore trouvé de patchs efficaces ;)