Laravel 8 GroupBy 仅向我返回每个组的第一条记录,但我需要按组中的所有记录

Posted

技术标签:

【中文标题】Laravel 8 GroupBy 仅向我返回每个组的第一条记录,但我需要按组中的所有记录【英文标题】:Laravel 8 GroupBy Is returning me the First records only for each group but i need All the Recors in a group by manner 【发布时间】:2021-09-07 14:20:24 【问题描述】:

我有 3 个模型 UserMyClassAssignedClassModels

用户表

id forename lastname
1 Rayhan Parvez
2 Tuhin Saud
3 Asif Ahmed
4 Shuvo Khan

MyClasses 表

id name
1 Ten
2 Six

AssignedClassModels 表

id MyClass_id user_id
1 1 1
2 2 2
3 1 3
4 2 4

所以,现在我想加入这 3 个表,并希望以按类的方式获得结果,但它总是给我每个组的第一条记录。

这是我的 JSON 输出结果


success: true,
message: "Display All The Pupil list Group by Class",
data: [

    
    id: 1,
    forename: "Rayhan",
    lastname: "Parvez",
    class_name: "Ten",
    class_id: 1
    ,
    
    id: 2,
    forename: "Tuhin",
    lastname: "Saud",
    class_name: "Six",
    class_id: 2
    

]

这是我的控制器代码

AssignedClassController

public function index()
    
        try 
            $class_list = DB::table('assigned_class_models')
            ->join('users', 'users.id', '=', 'assigned_class_models.user_id')
            ->join('my_classes', 'my_classes.id', '=', 'assigned_class_models.MyClass_id')
            ->select('users.id','users.forename','users.lastname','my_classes.name as class_name','my_classes.id as class_id')
            ->groupBy('my_classes.id')
            ->get();
             
            
            return response()->json([
                'success'=> true,
                'message' => 'Display All The user list Group by Class',
                'data'  => $class_list

            ] , 200);
         
        catch (\Throwable $th) 
            return response()->json([
                'success'=> false,
                'message' => 'Unauthorized User',
            ] , 401);
        
       
      

这是我的模型代码

AssignedClassModel

class AssignedClassModel extends Model

    use HasFactory;

    public function User()
        return $this->belongsTo(User::class , 'user_id' , 'id');
    

    public function MyClass()
        return $this->belongsTo(MyClass::class , 'MyClass_id' , 'id');
    

但是它没有给我每个组的所有记录,而是给我每个组的第一个记录,而不是给我,为什么?

【问题讨论】:

你必须使用 eloquent 和 laravel 关系然后它非常容易使用 laravel.com/docs/8.x/eloquent-relationships 如果需要更多帮助,请告诉我 是的,你必须更新你的问题添加你的模型然后我可以帮助你 是的,用它雄辩。 更新你的问题添加模型然后我会帮你正确 【参考方案1】:

您必须将groupBy 替换为orderBy

然后你会得到你的准确结果

注意:groupBy 跳过相同的值,以便获得第一行的结果。

我希望你得到你的解决方案谢谢。

【讨论】:

对不起,orderBy() 给了我所有的记录,但我需要类明智的 groupBy() 记录【参考方案2】:

通过使用 Eloquent 模型,我们可以轻松修复它下面是解决问题:

在模型 AssignedClassModel 中使用这些代码

class AssignedClassModel extends Model

    use HasFactory;

    public function User()
        return $this->belongsTo(User::class , 'user_id' , 'id');
    

    public function MyClass()
        return $this->belongsTo(MyClass::class , 'MyClass_id' , 'id');
    


在控制器中使用这些代码


$list =AssignedClassModel::With(['User','MyClass'])->get();
$list2 = $list->groupBy('MyClass_id');

return response()->json([
                'success'=> true,
                'message' => 'All The User list Group by Class',
                'data'  => $list2

            ] , 200);

现在您将获得完美的输出。

【讨论】:

以上是关于Laravel 8 GroupBy 仅向我返回每个组的第一条记录,但我需要按组中的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

单向 OneToMany JPA 仅向我显示第一个相关对象“n”次

我的模型Laravel如何能够在hasMany中返回每个项目的所有价格?

如何在 Laravel 中仅向访客用户显示或隐藏我的表的一部分?

如何为 Laravel ORM 中每个组中的单个项目执行 groupBy()

Laravel groupBy 返回项目数组而不是使用日期作为键

如何加入从我的数组的每个元素的数据库中提取的结果并在 Laravel 8 中以 json 形式返回