Laravel, system znajomości.

0

Cześć. Próbuję w Laravelu stworzyć system znajomości.
Mam tabelę users. Utworzyłem tabelę friends (pivot) z polami sender_id | recipient_id | status
Dodawanie, usuwanie etc działa jak należy.
Kod dodawania (wysyłania zaproszenie)

public function store(int $recipient_id)
    {
        return User::find(Auth::id())
            ->friends()->syncWithoutDetaching($recipient_id, ['status' => FriendshipStatus::SENT]);
    }

mam jednak problem z wyświetleniem listy osób
powiedzmy że mamy dwie osoby Kasia (id=1) i Basia (id=2), jeśli Kasia (sender_id = 1) zaprosiła Basię (recipient_id = 2) to na liście osób dla Basi powinny wyświetlić się dane Kasi a dla Kasi dane Basi. Nie wiem jak zrealizować takie zapytanie które będzie pobierać odpowiednie dane Na pewno należy użyć odpowiednich id ale nie wiem co dalej

2
Friend::where('sender_id', Auth::id())
    ->orWhere('recipient_id', Auth::id())
    ->with([
        'sender' => function ($q) {$q->wheere('id', '!=' ,Auth::id())},
        'recipient' => function ($q) {$q->wheere('id', '!=' ,Auth::id())},
        ])
->get();

Można oczywiście od drugiej strony też do tego podejść robiąc wherHas z modelu user, aczkolwiek jest to mniej wydajna opcja, ale czasem też potrzebna.

0

A do czego odnosi się with sender i recipient?

1

relacje do usera

0

działa dobrze. Dzięki.
Mam jeszcze jedno pytanie odnośnie
dodałem warunek statusu

public function getFriends(int $user_id)
    {
        return Friend::where(['sender_id' => $user_id, 'status' => FriendshipStatus::FRIENDS])
            ->orWhere(['recipient_id' => $user_id, 'status' => FriendshipStatus::FRIENDS])
            ->with([
                'sender' => function ($q) use ($user_id) {
                    $q->where('id', '!=', $user_id);
                },
                'recipient' => function ($q) use ($user_id) {
                    $q->where('id', '!=', $user_id);
                }
            ])
            ->get();
    }

czyli tutaj powinno zwrócić dane tylko jeśli status będzie równy 1. Dla osoby która zapraszała (sender_id) działa ok, dane nie są wyświetlane jeśli status jest 0, natomiast dla osoby zaproszonej już nie, kiedy status jest 0 dane się wyświetlają

1

bo to nie generuje zgrupowanych zapytań, dostałeś and i or płasko

return Friend::where(function($query) {
    $query->where(['sender_id' => $user_id])
    $query->where(['status' => FriendshipStatus::FRIENDS])
})
->orWhere(function($query) {
    $query->where(['recipient_id' => $user_id])
    $query->where(['status' => FriendshipStatus::FRIENDS])
})
->with([
    'sender' => function ($q) use ($user_id) {$q->where('id', '!=', $user_id);},
    'recipient' => function ($q) use ($user_id) {$q->where('id', '!=', $user_id); }])
->get();

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0