在Laravel中合并两个Eloquent集合

3
我有一个系统,允许用户创建项目并分配任务。现在我正在尝试定义视图,以显示当前用户创建或分配的所有项目。我已经设置了三个表之间的多对多关系:usersprojectsproject_user。其中,项目表有一个user_id列,用于指定“拥有”该项目的用户。
我尝试使用合并方法来基于这个问题的集合,但我无法使其工作。
$projects = new \Illuminate\Database\Eloquent\Collection();

$userProjects = Project::where(array('company_id' => Auth::user()->company_id, 'user_id' => Auth::user()->id))
        ->orderBy('created_at', 'asc')
        ->get();


//foreach($userProjects as $up){
    $projects = $projects->merge($userProjects);
//}

$assignedProjects = User::where('id', Auth::user()->id)->with('project')->orderBy('created_at', 'asc')->get();

foreach($assignedProjects as $assigned){
    $projects = $projects->merge($assigned->project);
}
dd($projects->all());

然后我尝试将其转换为数组,然后手动创建对象,但这也不太有效,我担心资源问题。

$userProjects = Project::where(array('company_id' => Auth::user()->company_id, 'user_id' => Auth::user()->id))
        ->orderBy('created_at', 'asc')
        ->get()->toArray();
$assignedProjects = User::where('id', Auth::user()->id)->with('project')->orderBy('created_at', 'asc')->get()->toArray();
$projects = array_merge((array) $userProjects, (array) $assignedProjects[0]['project']);
$cleaned = array_unique($projects, SORT_REGULAR);
$merge = array('projects' => (object) $cleaned);
$projects = (object) $merge;

dd($projects);

这是用户集合,但我只需要其中的项目关系 enter image description here 这是项目集合 enter image description here 目标是将这两个集合合并,以便我可以通过视图使用$project->title(例如)访问它。
当我只为用户“拥有”的项目执行此操作时,它工作得很好,现在如何使其能够显示既由用户拥有又分配给用户的项目?
1个回答

2
您正在寻找whereHas方法:
$allUserProjects = Project::whereHas('users', function ($query) {
        // you can replace 'id' column by 'users.id' for clarity
        $query->where('id', Auth::user()->id); 
    })
    ->orWhere(function ($query) {
            $query->where('company_id', Auth::user()->company_id)
                  ->where('user_id', Auth::user()->id);
    })
    ->orderBy('created_at', 'asc')
    ->get();

1
你太棒了,这样简单易懂,非常感谢!如果其他人需要上下文,请查看以下链接:https://laravel.com/docs/5.4/eloquent-relationships#querying-relationship-existence - Derek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接