简体   繁体   中英

Exclude items from a collection in Laravel

In my Laravel app, I have the concept of users, friends, and groups. A user can create and sort friends into groups.

A user can have many friends:

function friendsOfMine()
{
  return $this->belongsToMany('App\User', 'helpers', 'user_id', 'helper_id')
    ->wherePivot('accepted', '=', 1);
}

A group can have many users:

public function groupMembers()
{
    return $this->belongstoMany('App\User')->withTimestamps();
}

In the UI for adding friends to a group, I want to show the full list of a user's friends, but exclude those friends that have already been added to the group. My Groups Controller function looks like this, though I'm positive I'm off-base.

    public function add($id)
    {
    $group = Group::findOrFail($id);
    $helpers = $group->groupMembers;
    $id = $helpers->lists('id');
    $invitees = $this->user
        ->friendsOfMine()
        ->where('helper_id', '!=', $id)
        ->Paginate(5);
    return view('groups.add', compact('group','helpers','invitees'));
    }

Ideally, what I'd love is some way to write:

$helper = $group->friendsOfMine->not->groupMembers->Paginate(5);

Is there anyway to filter data using functions from two different models?

With your approach you would have to use whereNotIn() since you have an array of ids:

$id = $helpers->lists('id');
$invitees = $this->user
    ->friendsOfMine()
    ->whereNotIn('helper_id', $id)
    ->Paginate(5);

However you probably could something like this as well (assuming the relation group )

$invitees = $this->user
    ->friendsOfMine()
    ->whereDoesntHave('group', function($q) use ($id){
        $q->where('group_id', $id); // Note that id is the group id (not the array of ids from the helper)
    })
    ->Paginate(5);

For a nicer syntax (like in your example) you should look into Query Scopes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM