Maison  >  Questions et réponses  >  le corps du texte

Récupérez toutes les données avec des informations spécifiques du tableau croisé dynamique à l'aide d'Eloquent

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

P粉464208937P粉464208937380 Il y a quelques jours450

répondre à tous(1)je répondrai

  • P粉244155277

    P粉2441552772023-09-08 09:33:23

    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

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

    Ou vous pouvez créer des relations personnalisées pour les éléments terminés et inachevés dans le modèle.

    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);
        }
    }

    Dans le contrôleur utilisateur, vous pouvez les appeler

    $users = User::where('id', $user_id)
                ->with('completedCourses')
                ->get();

    répondre
    0
  • Annulerrépondre