Est ce que Tinker est bourré??

Par Benares, il y a 10 ans


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:

et quand j'utilise Tinker:

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, il y a 10 ans

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? =)

betaWeb, il y a 10 ans

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

Azorgh, il y a 10 ans

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.

Benares, il y a 10 ans

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