我有一个给出答案的线程,但后来我发现自己受到限制: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;
任何改善上述代码的方法?
我猜想用户和任务之间存在多对多的关系。为了使我的优化工作正常进行,我向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 ::方法的经验法则,您应该能够进行模型间的建模,而不是进行从一个模型到另一个模型的查询。