如何在laravel中进行以下操作或其他优化方式

问题描述 投票:0回答:1

我有一个给出答案的线程,但后来我发现自己受到限制:how to get list of users who are not under belongsToMany relation under a table in laravel?

所以在有答案的地方创建一个新线程,但是现在我该如何使用任何预构建功能(例如doesntHave或其他功能)来优化该线程。

以下是代码,该代码为我提供了属于组且未分配任何任务的用户列表。一组可以有多个任务,因此仅需要列出未分配任务的用户。


$gid = $task->group_id;
$MembersList =  $task->members;
$group_subscribers = Group::with(['subscribedUsers' => function($q){
    $q->select('id');
}])->whereId($gid)->get();
$group_subscribers = $group_subscribers[0]->subscribedUsers->pluck('id')->toArray();
$alreadyMembers =  DB::table('task_user')->select('user_id as id')->whereIn('user_id', $group_subscribers)->pluck('id')->toArray();
$finalList =  array_diff($group_subscribers, $alreadyMembers);
$users = User::whereIn('id', $finalList)->get();
return $users;

任何改善上述代码的方法?

laravel eloquent multiple-conditions
1个回答
0
投票

我猜想用户和任务之间存在多对多的关系。为了使我的优化工作正常进行,我向User模型添加了以下关系,当我们过滤订阅的用户时将使用此关系。

public class Users {
    public function tasks() {
        return $this->belongsToMany(Task::class);
    }
}

基本上,实现是过滤所有订户用户并检查他们是否有任务,因为任务是一种关系,它返回一个Collection,并且出于这个原因使用了isNotEmpty()

$groupId = $task->group_id;

$group = Group::with(['subscribedUsers.tasks'])->find($groupId));

$withoutTasks = $group->subscribedUsers->filter(function ($user) {
    return $user->tasks->isNotEmpty();
} );

return $withoutTasks;

这是避免使用DB ::方法的经验法则,您应该能够进行模型间的建模,而不是进行从一个模型到另一个模型的查询。

© www.soinside.com 2019 - 2024. All rights reserved.