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