我有以下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
。
请注意,使用关系,您可以避免复杂的查询,特别是在您的情况下。您不需要任何复杂的查询。只需使用雄辩的关系方法。