J'ai une relation plusieurs à plusieurs entre les utilisateurs et les cours qui contient un tableau croisé dynamique Users_Courses qui contient les valeurs isComplete
值,但我似乎无法在不循环每个用户并获取他们的课程的情况下检索 isComplete
, puis parcourt chaque cours pour obtenir les données pivots.
Tous les exemples que j'ai trouvés mappent isComplete
les valeurs aux classes avec des boucles, mais cela semble être extrêmement pénible pour le programme et je ne le trouve pas vraiment attrayant, c'est pourquoi je crée le mien. Mon propre problème est ici. Si je n'ai pas vu de réponse à cette question, veuillez la lier ci-dessous car je n'arrive pas à la trouver.
De plus, j'utilise Laravel-9 et MySQL.
La structure de données que je récupère ressemble maintenant à ceci :
"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" } ] } ]
Je cherche un moyen de récupérer la valeur pivot isComplete
avec Eloquent et d'obtenir les données de la classe elle-même, comme ceci ou quelque chose de similaire.
En d'autres termes, je souhaite vérifier si l'utilisateur a terminé le cours via la valeur du tableau croisé dynamique isComplete
comme le montre l'exemple ci-dessous. < /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 } ] } ]
Mon code actuel ressemble à ceci :
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, ]); } } }
Je sais que ça s'appelle isCompleted
dans le code, mais ça s'appelle aussi ainsi dans la base de données. C'est une faute de frappe qui n'a pas encore été corrigée :D
En d'autres termes, je souhaite vérifier si l'utilisateur a terminé le cours via la valeur du tableau croisé dynamique isComplete comme indiqué dans l'exemple ci-dessous.
Avez-vous entendu parler du filtrage avec les colonnes du tableau croisé dynamique dans la documentation : https://laravel.com/docs/9.x/eloquent-relationships#filtering-queries-via-intermediate-table-columns
Si vous avez seulement besoin de cours terminés, vous pouvez appeler la relation
Ou vous pouvez créer des relations personnalisées pour les éléments terminés et inachevés dans le modèle.
Dans le contrôleur utilisateur, vous pouvez les appeler