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 个模型 User 、 MyClass 和 AssignedClassModels
用户表
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()