如何执行Laravel嵌套查询



我有以下3个表

教室

id subject

注册研究

id user_id class_id

帖子

id class_id type attachment

型号

Classroom.php

public function posts()
{
return $this->hasMany(Post::class);
}

RegisteredStudents.php

public function classroom()
{
return $this->belongsTo(Classroom::class);
}

Post.php

public function classroom()
{
return $this->belongsTo(Classroom::class);
}

现在我需要获得特定班级的所有帖子,学生在该班级下注册。

例如,一个学生注册了教室表中id号为1的班级。因此,在registeredstudents表中会注意到,这个特定的用户是在这个特定的类下注册的。每个类在post表中可能有多个post。并且用户需要获得其类的所有帖子。

我正在尝试这样的东西:

$registered_classes = RegisteredStudent::where('user_id',$user->id)
->where(function ($q) use ($class_id){
Post::where('class_id',$class_id);
})->get();

这肯定是不正确的。对此的正确查询是什么。

您已经创建了具有classroom关系的RegisteredStudent模型。问题是,如果你的foreign_key与Laravel Behavior不同,你必须将其包含在关系中。像这样:

Classroom.php

public function posts(): HasMany
{
return $this->hasMany(Post::class, 'class_id');
}

*Laravel Behavior需要使用classroom_id而不是class_id

RegisteredStudent.php

public function classroom(): BelongsTo
{
return $this->belongsTo(Classroom::class, 'class_id');
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}

Post.php

public function classroom(): BelongsTo
{
return $this->belongsTo(Classroom::class, 'class_id');
}

更多关于Laravel行为的详细信息,这里有完整的例子

*已编辑

然后,如果你想获得学生注册的特定班级的所有帖子,你可以使用with方法:

public function getAllPostsClassroom()
{
$registeredUser = RegisteredStudent::where('user_id', $user->id)->with(['classroom.posts' => function($query) use ($class_id) {
$query->where('class_id', $class_id);
}])->first();
}

您将在注册用户的Classroom内获得所有Posts

您首先需要按照TheArKa在他的回答中所说的那样更正关系(因为表和类名没有正确遵循laravel雄辩的约定(。

Classroom.php

public function posts()
{
return $this->hasMany(Post::class, 'class_id');
}

RegisteredStudent.php

public function classroom()
{
return $this->belongsTo(Classroom::class, 'class_id');
}

那么正确的查询应该是:

$posts_of_class_of_user =
RegisteredStudent::where('user_id',$user->id)->first()->classroom->posts;

这将首先从RegisteredStudent获取注册用户,然后从belongsTo relation获取Classroom实例,然后从hasMany relation获取所有相关的posts

请注意,使用关系,您可以避免复杂的查询,特别是在您的情况下。您不需要任何复杂的查询。只需使用雄辩的关系方法。

最新更新