laravel-acquaintances icon indicating copy to clipboard operation
laravel-acquaintances copied to clipboard

Get unrelated users

Open wagnerdevel opened this issue 1 year ago • 3 comments

How could I get a list of unrelated users. I need to put together a list of friendship suggestions.

Thanks!

wagnerdevel avatar Mar 18 '23 03:03 wagnerdevel

I'm currently using it like this:

$users = $user->doesntHaveFriendships()
    ->where('id', '<>', $user->id)
    ->inRandomOrder()
    ->take($limit )
    ->get();

I added in my App\Models\User.php model:

public function invertedFriends()
{
    $friendshipModelName = Interaction::getFriendshipModelName();
    return $this->morphMany($friendshipModelName, 'recipient');
}

public function scopeDoesntHaveFriendships(Builder $builder)
{
    return $builder->whereDoesntHave('friends')
        ->whereDoesntHave('invertedFriends');
}

But I wouldn't want to have additional methods in the model. Any suggestion?

wagnerdevel avatar Mar 18 '23 03:03 wagnerdevel

The same need happens to list the publications of the user and friends:

$user = auth()->user();

$publications = Publication
    ::where(function (Builder $query) use ($user) {
        $query->whereHas('user.friends', function (Builder $query) {
            $query->where('status', Status::ACCEPTED);
        })->orWhereHas('user.invertedFriends', function (Builder $query) {
            $query->where('status', Status::ACCEPTED);
        })->orWhere('user_id', $user->id);
    })
    ...

It is necessary to use invertedFriends from the User.php model. The ideal would be something like:

$user = auth()->user();

$publications = Publication
    ::where(function (Builder $query) use ($user) {
        $query->whereHas('user.friends', function (Builder $query) {
            $query->where('status', Status::ACCEPTED);
        })->orWhere('user_id', $user->id);
    })
    ...

wagnerdevel avatar Mar 18 '23 04:03 wagnerdevel

Did you ever figure this out? I'm trying to implement something similar.

Chlemdel avatar May 01 '23 09:05 Chlemdel