2015-04-23 8 views
5

Próbuję stworzyć system przyjaźni w grze 5 i utknąłem. Mam tabeli friends_user które wyglądać tak:Laravel - Przyjaźń

  • id
  • user_id
  • friend_id
  • stan

Oto punkt, idę do strony użytkownika, a Ii Chcę zobaczyć, jaki jest mój związek z tym użytkownikiem, 4 rozwiązania:

  • Jesteśmy przyjaciółmi
  • Nie
  • jesteśmy On nie zaakceptował żądania jeszcze
  • muszę potwierdzić, czy nie.

Chcę utworzyć metodę sprawdzającą, czy użytkownik jest przyjacielem z innym, prostym. Mam kolumnie „Stan”, która jest logiczna (0 na oczekiwaniu i 1 dla przyjaciół) Idealne rozwiązanie dla mnie byłoby, aby móc w jeden sposób, by sprawdzić, czy:

  • Użytkownicy są przyjacielu więc albo ("user_id", Auth :: user() -> id) -> i ("friend_id", $ friend-> id) lub odwrotnie ("user_id", $ friend-> id) -> i (' friend_id ', Auth :: user() -> id), musi sprawdzić 2 zmysły
  • Wysłałem żądanie i muszę poczekać na jego odpowiedź
  • Otrzymałem wniosek i muszę go zaakceptować.
  • Nie jesteśmy przyjaciółmi, więc mogę go dodać.

Więc jeśli możesz mi powiedzieć, gdzie się mylę tutaj, tu jest moja logika (tylko dla sprawdzenia, czy użytkownicy są przyjaciel): User.php

public function isFriend($slug) 
{ 
    // Get both user 
    $user = Auth::user(); 
    $receiver = User::where('slug', $slug)->first(); 
    // get list of friends (so who have status = 1) 
    $result = Friends::where('status', 1); 
    // Get users where user id is equal to connected 
    $result = $result->where('user_id', $user->id)->where('friend_id', $receiver->id); 
    $result = $result->orWhere('user_id', $receiver->id)->where('friend_id', $user->id); 
    $result = $result->get(); 
    if(count($result) == 0) 
     return false; 
    return true; 
} 

Po robię te kontrole moim zdaniem .
To działa praktycznie, ale tylko wtedy, gdy ja (bieżący użytkownik) wysłał żądanie, ale jeśli jest odwrotnością, zwraca mi użytkownika, nawet jeśli status jest na poziomie 0. Myślę, że mój $ wynik kasuje pozostałe. t to? Jakie jest rozwiązanie?
Mam nadzieję, że jest to jasne i jeśli możesz mi powiedzieć, jak to zrobić w czysty sposób, byłoby wspaniale.

+0

Sprawdź tę serię .. https://laracasts.com/series/build-a-laravel-app-from-scratch Jest tam lekcja o przyjaciołach – bretterer

+2

Ty bawiących rzeczy trochę dlaczego masz stół Przyjaciół? Znajomy nie jest użytkownikiem? jeśli tak, to dlaczego nie masz wielu do wielu własnych relacji na stole użytkowników? –

+1

@bretterer Musisz uzyskać subskrypcję, aby uzyskać dostęp do wideo. (Ale jeśli chcesz się nauczyć o laravel i php, jest to bardzo dobry sposób na zainwestowanie 9 $) – Needpoule

Odpowiedz

3

To powszechny błąd. Uważaj na klauzulę "orWhere".

public function isFriend($slug) 
{ 
    // Get both user 
    $user = Auth::user(); 
    $receiver = User::where('slug', $slug)->first(); 
    // get list of friends (so who have status = 1) 

    $result = Friends::where('status',1)->where(function($query) use ($receiver,$user) 
    { 
     $query->where([ 
      'user_id' => $user->id, 
      'friend_id' => $receiver_id 
     ])->orWhere([ 
      'user_id' => $receiver->id, 
      'friend_id' => $user->id 
     ]); 

    })->get(); 

    return ! $result->isEmpty(); 
}