【问题标题】:How to do the following with doesn't have or other optimized way in laravel如何在 laravel 中使用没有或其他优化方式执行以下操作
【发布时间】:2019-12-11 10:51:27
【问题描述】:

我有一个帖子给出了答案,但后来我发现我遇到了限制: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】:

    我猜用户和任务是多对多的关系。为了优化工作,我在 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:: 方法是一个经验法则,您应该能够从一个模型转到另一个模型,而不是从一个模型到另一个模型进行查询。

    【讨论】:

    • 今天会检查这个并在这里更新:)
    • 对您的问题有帮助吗?
    • 请稍等一下,因为当我得到您的答复时,我不得不转移到我面临问题的其他部分。所以让我先解决这个问题,因为旧代码正在运行,然后将实施您的答案并在此处更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多