使用 Eloquent 从数据透视表中检索具有特定信息的所有数据
P粉464208937
P粉464208937 2023-09-07 21:40:28
0
1
404

我在用户和课程之间有一个多对多关系,其中包含一个数据透视表 Users_Courses,其中包含isComplete值,但我似乎无法在不循环每个用户并获取他们的课程的情况下检索isComplete值然后循环每个课程获取枢轴数据。

我发现的所有示例都是将isComplete值映射到带有循环的课程,但这似乎对程序造成了极大的负担,而且我并没有真正发现它有吸引力,这就是为什么我要制作我的自己的问题在这里。如果我还没有看到这个问题的答案,请在下面链接它,因为我似乎找不到它。

此外,我正在使用 Laravel-9 和 MySQL。

我现在检索的数据结构如下所示:

"data": [ { "id": 2, "fname": "name", "lname": "last name", "email": "mail@mail.com", "courses": [ { "id": 1, "name": "test_course_1", "description": "this is a test course for testing" }, { "id": 2, "name": "test_course_2", "description": "this is also a test course" }, { "id": 3, "name": "test_course_3", "description": "this course is a test course" } ] } ]

我正在寻找一种方法来检索枢轴值isComplete与 Eloquent 并获取课程本身的数据,就像这样或类似的东西。

换句话说,我想通过数据透视表值isComplete来检查用户是否完成了课程,如下例所示。< /p>

"data": [ { "id": 2, "fname": "name", "lname": "last name", "email": "mail@mail.com", "courses": [ { "id": 1, "name": "test_course_1", "description": "this is a test course for testing", "isComplete": 1 }, { "id": 2, "name": "test_course_2", "description": "this is also a test course", "isComplete": 0 }, { "id": 3, "name": "test_course_3", "description": "this course is a test course", "isComplete": 0 } ] } ]

我现在的代码如下所示:

class User extends Authenticatable { public function courses() { return $this->belongsToMany(Course::class, 'user_courses') ->withPivot('isCompleted'); } }
class Course extends Model { public function users() { return $this->belongsToMany(User::class, 'user_courses') ->withPivot('isCompleted'); } }
class UserController extends Controller { public function getUsersById(int $user_id) { try { $users = User::where('id', $user_id) ->with('courses') ->get(); return response()->json([ 'success' => true, 'data' => $users ]); } catch (Throwable $th) { return response()->json([ 'success' => false, 'data' => null, 'message' => $th, ]); } } }

我知道它在代码中称为isCompleted,但在数据库中也这么叫。这是一个尚未修复的打字错误:D

P粉464208937
P粉464208937

全部回复 (1)
P粉244155277

换句话说,我想通过数据透视表值 isComplete 检查用户是否已完成课程,如下例所示。

您是否在文档中阅读了有关使用数据透视表列进行过滤的信息:https://laravel.com/docs/9.x/eloquent-relationships#filtering-queries-via-intermediate-table-columns

如果您只需要完成的课程,您可以将关系称为

$users = User::where('id', $user_id) ->with(['courses' => function($query) { $query->wherePivot('isCompleted', 1); // use quotes if its datatype is enum in database. }]) ->get();

或者您可以为模型中的已完成、未完成建立自定义关系。

class User extends Authenticatable { public function courses() { return $this->belongsToMany(Course::class, 'user_courses') ->withPivot('isCompleted'); } public function completedCourses() { $this->courses()->wherePivot('isCompleted', 1); } public function InCompleteCourses() { $this->courses()->wherePivot('isCompleted', 0); } }

在用户控制器中,您可以将它们称为

$users = User::where('id', $user_id) ->with('completedCourses') ->get();
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!