Heim > Fragen und Antworten > Hauptteil
Ich habe eine Viele-zu-Viele-Beziehung zwischen Benutzern und Kursen, die eine Pivot-Tabelle Users_Courses enthält, die die isComplete
值,但我似乎无法在不循环每个用户并获取他们的课程的情况下检索 isComplete
-Werte enthält und dann jeden Kurs durchläuft, um die Pivot-Daten zu erhalten.
Alle Beispiele, die ich gefunden habe, ordnen isComplete
Werte Klassen mit Schleifen zu, aber das scheint das Programm extrem zu belasten und ich finde es nicht wirklich attraktiv, weshalb ich mein eigenes Problem habe Hier. Wenn ich keine Antwort auf diese Frage gesehen habe, verlinken Sie sie bitte unten, da ich sie anscheinend nicht finden kann.
Außerdem verwende ich Laravel-9 und MySQL.
Die Datenstruktur, die ich jetzt abrufe, sieht so aus:
"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" } ] } ]
Ich suche nach einer Möglichkeit, den Pivot-Wert isComplete
mit Eloquent abzurufen und die Daten für die Klasse selbst abzurufen, so oder so ähnlich.
Mit anderen Worten, ich möchte anhand des Pivot-Tabellenwerts isComplete
überprüfen, ob der Benutzer den Kurs abgeschlossen hat, wie im Beispiel unten gezeigt. < /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 } ] } ]
Mein aktueller Code sieht so aus:
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, ]); } } }
Ich weiß, dass es im Code isCompleted
heißt, aber in der Datenbank heißt es auch so. Dies ist ein Tippfehler, der noch nicht behoben wurde :D
P粉2441552772023-09-08 09:33:23
换句话说,我想通过数据透视表值 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();