Dapatkan semua data dengan maklumat khusus daripada jadual pangsi menggunakan Eloquent
P粉464208937
P粉464208937 2023-09-07 21:40:28
0
1
509

Saya mempunyai banyak hubungan antara pengguna dan kursus yang mengandungi jadual pangsi Users_Courses yang mengandungi nilai isComplete 值,但我似乎无法在不循环每个用户并获取他们的课程的情况下检索 isComplete dan kemudian gelung melalui setiap kursus untuk mendapatkan data pangsi.

Semua contoh yang saya temui peta isComplete nilai kepada kelas dengan gelung, tetapi ini nampaknya sangat membebankan program dan saya tidak begitu menarik, itulah sebabnya saya membuat kelas saya Masalah saya sendiri ialah di sini. Jika saya tidak melihat jawapan kepada soalan ini, sila pautkannya di bawah kerana saya tidak dapat mencarinya.

Selain itu, saya menggunakan Laravel-9 dan MySQL.

Struktur data yang saya dapatkan sekarang kelihatan seperti ini:

"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"
                }
            ]
        }
    ]

Saya sedang mencari cara untuk mendapatkan semula nilai pangsi isComplete dengan Eloquent dan dapatkan data untuk kelas itu sendiri, seperti ini atau yang serupa.

Dalam erti kata lain, saya ingin menyemak sama ada pengguna menyelesaikan kursus melalui nilai jadual pangsi isComplete seperti yang ditunjukkan dalam contoh di bawah. < /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
                }
            ]
        }
    ]

Kod semasa saya kelihatan seperti ini:

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

Saya tahu ia dipanggil isCompleted dalam kod, tetapi ia juga dipanggil begitu dalam pangkalan data. Ini adalah salah taip yang belum diperbaiki lagi :D

P粉464208937
P粉464208937

membalas semua(1)
P粉244155277

Dalam erti kata lain, saya ingin menyemak sama ada pengguna telah melengkapkan kursus melalui nilai jadual pangsi isComplete seperti yang ditunjukkan dalam contoh di bawah.

Adakah anda membaca tentang menapis dengan lajur jadual pangsi dalam dokumentasi: https://laravel.com/docs/9.x/eloquent-relationships#filtering-queries-via-intermediate-table-columns

Jika anda hanya memerlukan kursus yang telah selesai, anda boleh menghubungi perhubungan

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

Atau anda boleh membuat perhubungan tersuai untuk lengkap dan belum selesai dalam model.

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

Dalam pengawal pengguna anda boleh memanggil mereka

$users = User::where('id', $user_id)
            ->with('completedCourses')
            ->get();
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan