从Laravel中的集合中排除项目

时间:2015-07-12 17:29:02

标签: php laravel eloquent laravel-5

在我的Laravel应用程序中,我有用户,朋友和群组的概念。用户可以创建朋友并将其分类到组中。

用户可以有很多朋友:

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

一个群组可以有很多用户:

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

在用于向群组添加朋友的用户界面中,我想显示用户朋友的完整列表,但不包括那些已添加到群组中的朋友。我的群组控制器功能看起来像这样,虽然我非常积极地离开基地。

    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'));
    }

理想情况下,我喜欢的是写作方式:

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

是否有使用两种不同型号的功能过滤数据?

1 个答案:

答案 0 :(得分:0)

使用您的方法,您必须使用whereNotIn(),因为您有一系列ID:

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

但是你也可能会这样(假设关系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);

要获得更好的语法(例如您的示例),您应该查看Query Scopes